题目:https://cn.vjudge.net/problem/URAL-1167
转自:http://blog.youkuaiyun.com/xuechelingxiao/article/details/38256795
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x7ffffff;
int a[505];
int b[505][505], c[505][505];
int sum[505][505];
int dp[505][505];
int main(){
int n, k;
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; ++i){
scanf("%d", &a[i]);
dp[0][i]= INF;
}
for(int i = 1; i <= n; ++i){
for(int j = i; j <= n; ++j){
if(a[j] == 0){
b[i][j] = b[i][j-1]+1, c[i][j] = c[i][j-1];
}
else{
b[i][j] = b[i][j-1], c[i][j] = c[i][j-1]+1;
}
sum[i][j] = b[i][j]*c[i][j];
}
}
int p;
for(int i = 1; i <= k; ++i){
for(int j = 1; j <= n; ++j){
int Min = INF;
for(int t = 1; t <= j; ++t){
p = dp[i-1][t-1]+sum[t][j]; //从t到j放到i里
Min = min(Min, p);
}
dp[i][j] = Min;
}
}
printf("%d\n", dp[k][n]);
return 0;
}