[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;
}

 

posted @ 2018-06-04 15:53  void_f  阅读(141)  评论(0编辑  收藏  举报