挺烦的一个dp,要注意一下细节。。。
貌似我的dp和网上的有点不一样?
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define maxn 55 #define maxt 2505 using namespace std; int n,m,t,map[maxn][maxn],f[maxn][maxt],g[maxn][maxt],dp[maxt]; int r1,r2; char s[maxn]; int main() { scanf("%d%d%d",&n,&m,&t); for (int i=1;i<=n;i++) { scanf("%s",s); for (int j=1;j<=m;j++) { if (s[j-1]=='0') map[i][j]=0; else map[i][j]=1; } } for (int i=1;i<=n;i++) { memset(f,0,sizeof(f));memset(g,0,sizeof(g)); f[1][1]=1;g[1][1]=1;if (map[i][1]==0) r1=1,r2=0;else r1=0,r2=1; for (int j=2;j<=m;j++) { for (int k=1;k<=j;k++) { if (!map[i][j]) f[j][k]=f[r1][k]+1; else f[j][k]=f[r2][k]+1; f[j][k]=max(f[j][k],g[j-1][k-1]+1); g[j][k]=max(g[j-1][k],f[j][k]); } if (!map[i][j]) r1=j;else r2=j; } for (int j=t;j>=0;j--) for (int k=0;k<=j;k++) dp[j]=max(dp[j],dp[j-k]+g[m][k]); } printf("%d\n",dp[t]); return 0; }