P4158 [SCOI2009]粉刷匠(dp)

一个比较好的性质:不可能存在不刷的情况,刷上就有可能对,所以得到递推式

#include<cstdio>
#include<iostream>
using namespace std;
int a[55][55];
int dp[55][55][2501][2],n,ans,m,t;
int main(){
    scanf("%d%d%d",&n,&m,&t);
    for(int i=1;i<=n;i++){
        char c[55];
        scanf("%s",c+1);
        for(int j=1;j<=m;j++){
            a[i][j]=c[j]-'0';
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            for(int k=1;k<=t;k++){
                if(j==1){
                    dp[i][j][k][0]=max(dp[i-1][m][k-1][1],dp[i-1][m][k-1][0]);
                    dp[i][j][k][1]=max(dp[i-1][m][k-1][1],dp[i-1][m][k-1][0])+1;
                }
                else
                    if(a[i][j]!=a[i][j-1]){
                        dp[i][j][k][0]=max(dp[i][j-1][k][1],dp[i][j-1][k-1][0]);
                        dp[i][j][k][1]=max(dp[i][j-1][k][0],dp[i][j-1][k-1][1])+1;
                    }
                    else{
                        dp[i][j][k][0]=max(dp[i][j-1][k][0],dp[i][j-1][k-1][1]);
                        dp[i][j][k][1]=max(dp[i][j-1][k][1],dp[i][j-1][k-1][0])+1;
                    }
            }
        }
    }
    ans=max(dp[n][m][t][0],dp[n][m][t][1]);
    printf("%d",ans);
    return 0;
}
posted @ 2021-11-18 15:06  dfydn  阅读(34)  评论(0编辑  收藏  举报