1296: [SCOI2009]粉刷匠

好久没做这么水的DP题了,所以懒得优化了,好像可以压掉一维(或者好像一维数组够用了),不过我比较懒,就懒得压维了。

状态转移也好像可以优化,但是我。。。咳咳。

反正用最朴素的就好了,枚举刷第i次,正在刷第j块木板,要刷到第k个格子,那么自然可以从第h(0<=h<=k)个格子转移过来,这里k=h是不刷,因为可能还没刷到t次就刷完了,不过貌似省掉这个最后判断也可以(我懒)。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int f[55][55][2505],sum[55][55];
char ch[55];
int main(){
	int n,m,t;scanf("%d %d %d",&n,&m,&t);
	for(int i=1;i<=n;i++){
		scanf("%s",ch+1);
		for(int j=1;j<=m;j++)
		sum[i][j]=sum[i][j-1]+ch[j]-'0';
	}
	for(int i=1;i<=t;i++)
	for(int j=1;j<=n;j++)
	for(int k=0;k<=m;k++){
		if(!k)f[j][k][i]=f[j-1][m][i];
		else{
			for(int h=0;h<=k;h++)
			f[j][k][i]=max(f[j][k][i],f[j][h][i-1]+max(sum[j][k]-sum[j][h],k-h-(sum[j][k]-sum[j][h])));
		}
	}
	printf("%d",f[n][m][t]);
	return 0;
}


你可能感兴趣的:(1296: [SCOI2009]粉刷匠)