[BZOJ1296][SCOI2009]粉刷匠(DP)
每一行做一个DP,然后整体矩阵做一次DP即可
好惨啊,三目运算符记得要加括号
Code
#include <cstdio>
#include <algorithm>
#define N 66
using namespace std;
int n,m,T,f[N][N*N],g[N][N],sum[N],Ans;
char s[N];
int main(){
scanf("%d%d%d",&n,&m,&T);
for(int i=1;i<=n;++i){
scanf("%s",s+1);
for(int j=1;j<=m;++j) sum[j]=sum[j-1]+((s[j]=='1')?1:0);
for(int j=1;j<=m;++j)
for(int k=1;k<=m;++k){
g[k][j]=0;
for(int l=0,x;l<k;++l){
x=sum[k]-sum[l];
g[k][j]=max(g[k][j],g[l][j-1]+max(x,k-l-x));
}
}
for(int j=1;j<=T;++j)
for(int k=1,x=min(j,m);k<=x;++k)
f[i][j]=max(f[i][j],f[i-1][j-k]+g[m][k]);
}
for(int i=1;i<=T;++i) Ans=max(Ans,f[n][i]);
printf("%d\n",Ans);
return 0;
}

浙公网安备 33010602011771号