#include #include #include #include using namespace std; #define NMAX 500 #define KMAX 500 #define INFTY INT_MAX int N, K; int M[2][NMAX+1]; short H[NMAX+1]; short B[NMAX+1][NMAX+1]; int main() { cin >> N >> K; for ( int i = 1; i <= N; i++ ) cin >> H[i]; for ( int i = 1; i <= N; i++ ) { B[i][i] = (H[i])? 1 : 0; for ( int j = i+1; j <= N; j++ ) B[i][j] = (H[j])? (B[i][j-1]+1) : B[i][j-1]; } for ( int i = 0; i <= 1; i++ ) for ( int n = 0; n <= N; n++ ) M[i][n] = INFTY; int curr = 1, prev = 0; M[curr][0] = 0; for ( int k = 1; k <= K; k++ ) { swap(curr, prev); for ( int n = 1; n <= N; n++ ) { // M[k][n]. M[curr][n] = INFTY; for ( int p = k-1; p <= n-1; p++ ) { if ( M[prev][p] == INFTY ) continue; const int nb = B[p+1][n]; const int nw = n - (p+1) + 1 - nb; const int cost = nb*nw + M[prev][p]; if ( cost < M[curr][n] ) M[curr][n] = cost; } } } cout << M[curr][N] << endl; return 0; }