BZOJ 1296 粉刷匠

Posted on 2016-10-30 16:01  ziliuziliu  阅读(111)  评论(0编辑  收藏  举报

挺烦的一个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;
}