[SCOI2009]粉刷匠(dp)

[SCOI2009]粉刷匠

https://ac.nowcoder.com/acm/problem/20273

参考题解

题意:略。

题记:dp[i][j][k][0/1]表示为前i条j段涂k次,最后一段涂红/蓝的最多正确格子数。

可以理解为将所有木条分成了n*m的木块。然后一块一块地填。
那么可以分成两种情况:
1、当前木块是整条木板的第一块,一定要进行一次新的涂色。(即j为1的情况)
由上一条木条的最后一块木板转移过来

当前木块涂红色:dp[i][j][k][0]=max(dp[i−1][m][k−1][0],dp[i−1][m][k−1][1])+(mp[i][j]==0);

当前木块涂蓝色:dp[i][j][k][1]=max(dp[i−1][m][k−1][0],dp[i−1][m][k−1][1])+(mp[i][j]==1);

2、当前木块不是整条木板的第一块,根据前一块木块的颜色来
判断是否需要新的涂色。(即j不为1的情况)
由同一条木条的前一块木板转移过来

当前木块涂红色:dp[i][j][k][0]=max(dp[i][j−1][k][0],dp[i][j−1][k−1][1])+(mp[i][j]==0);

当前木块涂蓝色:dp[i][j][k][1]=max(dp[i][j−1][k][1],dp[i][j−1][k−1][0])+(mp[i][j]==1);

#include<bits/stdc++.h>

using namespace std;
const int N=55;
char mp[N][N];
int dp[N][N][2510][2];//dp[i][j][k][0/1]
//前i条j段涂k次,最后一段涂红/蓝的最多正确格子数
//红(0)蓝(1)
int main(){
    int n,m,t;
    cin>>n>>m>>t;
    for(int i=1;i<=n;i++)
        cin>>mp[i]+1;
    for(int i=1;i<=n;i++){//枚举第i条木板
        for(int j=1;j<=m;j++){//枚举第j段
            for(int k=1;k<=t;k++){//枚举涂的次数
                if(j==1){
                    dp[i][j][k][0]=max(dp[i-1][m][k-1][0],dp[i-1][m][k-1][1])+(mp[i][j]=='0');
                    dp[i][j][k][1]=max(dp[i-1][m][k-1][0],dp[i-1][m][k-1][1])+(mp[i][j]=='1');
                }
                else{
                    dp[i][j][k][0]=max(dp[i][j-1][k][0],dp[i][j-1][k-1][1])+(mp[i][j]=='0');
                    dp[i][j][k][1]=max(dp[i][j-1][k][1],dp[i][j-1][k-1][0])+(mp[i][j]=='1');
                }
            }
        }
    }
    cout<<max(dp[n][m][t][0],dp[n][m][t][1])<<endl;
    return 0;
}
全部评论

相关推荐

09-12 11:55
已编辑
湖南工商大学 Java
那一天的Java_J...:这种一堆问题的,别去
点赞 评论 收藏
分享
敢逐云霄志:你打招呼语怎么能这么长,hr都没看下去的欲望,简明扼要说重点,就读于某某学校某某专业,26届应届毕业生,学信网可查,先后在某某公司实习过(如有),然后做过什么项目,想找一份什么样的工作,可实习几个月以上,期待您的回复。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务