题目大意
把NNN只马分配到KKK个马房里,并且按照顺序放。
对于每一个马房都有一个叫做“不高兴系数”,即白色马的数量∗*∗黑色马的数量。
任务是合理地分配这NNN只马,使得它所有马房的“不高兴系数”和最小。
题目解析
DPDPDP,设f[i][j]f[i][j]f[i][j]表示用iii个马房装jjj匹马的最小不高兴系数
预处理第iii匹马时有多少只白马,多少只黑马,接着算出一个马房装1 n1~n1 n匹马的不高兴系数为多少
f[i][j]=f[i−1][k]+(b[j]−b[k])∗(w[j]−w[k])f[i][j]=f[i-1][k]+(b[j]-b[k])*(w[j]-w[k])f[i][j]=f[i−1][k]+(b[j]−b[k])∗(w[j]−w[k])
在前jjj只马中在分出一个马房,以kkk为一个中间量划分
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,k;
int a[505],w[505],b[505],f[505][505];
int main()
{
freopen("farmer.in","r",stdin);
freopen("farmer.out","w",stdout);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(a[i]) b[i]=1;
else w[i]=1;
b[i]+=b[i-1];
w[i]+=w[i-1];
}
memset(f,0x3f,sizeof(f));
for(int i=1;i<=n;i++)
f[1][i]=w[i]*b[i];
for(int i=2;i<=k;i++)
for(int j=i+1;j<=n;j++)
for(int k=1;k<j;k++)
f[i][j]=min(f[i][j],f[i-1][k]+(w[j]-w[k])*(b[j]-b[k]));
printf("%d",f[k][n]);
}