每一行做一个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 ",Ans); return 0; }