【题解】洛谷P4158 [SCOI2009] 粉刷匠(DP)
次元传送门:洛谷P4158
思路
f[i][j][k][0/1]表示在坐标为(i,j)的格子 已经涂了k次 (0是此格子涂错 1是此格子涂对)涂对的格子数
显然的是 每次换行都要增加一次次数
那么当j=1时:
f[i][j][k][]=max(f[i-][m][k-][],f[i-][m][k-][])+;//可以从前一排最后一个转移过来 记得+1
f[i][j][k][]=max(f[i-][m][k-][],f[i-][m][k-][]);//同理 不用+1
当j>1时分成两种情况
- 当第i格和第i-1格相同
f[i][j][k][]=f[i][j-][k][]+;//最优为前一个不换方案即可+1 因为同色
f[i][j][k][]=max(f[i][j-][k][],f[i][j-][k-][]);//如果不对的话 就要从前面也错不换刷子或者前面对换刷子中取最大值
- 当第i格和第i-1格不同
f[i][j][k][]=max(f[i][j-][k-][]+,f[i][j-][k][]+);//当前是对的可以从前面是对的但是换刷子或者前面是错的不换刷子中来 记得+1
f[i][j][k][]=max(f[i][j-][k][],f[i][j-][k-][]);//当前是错的可以从前面是对的不用换刷子或者前面是错的但是换刷子中来 不用+1
每次查找都要取ans
因为有可能在任意一格停下
代码
#include<iostream>
using namespace std;
#define maxn 55
int n,m,t,ans;
int map[maxn][maxn];
int f[maxn][maxn][maxn*maxn][];
int main()
{
cin>>n>>m>>t;
for(int i=;i<=n;i++)//输入操作
{
string s;
cin>>s;
for(int j=;j<s.size();j++)
map[i][j+]=s[j]-'';
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int k=;k<=t;k++)
{
if(j==)//第一排
{
f[i][j][k][]=max(f[i-][m][k-][],f[i-][m][k-][])+;
f[i][j][k][]=max(f[i-][m][k-][],f[i-][m][k-][]);
}
else
{
if(map[i][j]==map[i][j-])//相同
{
f[i][j][k][]=f[i][j-][k][]+;
f[i][j][k][]=max(f[i][j-][k][],f[i][j-][k-][]);
}
else//不同
{
f[i][j][k][]=max(f[i][j-][k-][]+,f[i][j-][k][]+);
f[i][j][k][]=max(f[i][j-][k][],f[i][j-][k-][]);
}
}
ans=max(ans,max(f[i][j][k][],f[i][j][k][]));
}
cout<<ans;
}
【题解】洛谷P4158 [SCOI2009] 粉刷匠(DP)的更多相关文章
- 洛谷 P4158 [SCOI2009]粉刷匠 题解
每日一题 day59 打卡 Analysis 很容易看出是一个dp, dp[i][j[k][0/1]来表示到了(i,j)时,刷了k次,0表示这个没刷,1表示刷了. 于是有转移: 1.换行时一定要重新刷 ...
- 洛谷P4158 [SCOI2009]粉刷匠
传送门 设$dp[i][j][k][0/1]$表示在涂点$(i,j)$,涂了$k$次,当前点的颜色是否对,最多能刷对多少个格子 首先换行的时候肯定得多刷一次 然后是如果和前一个格子颜色相同,那么当前点 ...
- Luogu P4158 [SCOI2009]粉刷匠(dp+背包)
P4158 [SCOI2009]粉刷匠 题意 题目描述 \(windy\)有\(N\)条木板需要被粉刷.每条木板被分为\(M\)个格子. 每个格子要被刷成红色或蓝色. \(windy\)每次粉刷,只能 ...
- BZOJ 1296: [SCOI2009]粉刷匠( dp )
dp[ i ][ j ] = max( dp[ i - 1 ][ k ] + w[ i ][ j - k ] ) ( 0 <= k <= j ) 表示前 i 行用了 j 次粉刷的机会能正 ...
- [Bzoj1296][Scoi2009] 粉刷匠 [DP + 分组背包]
1296: [SCOI2009]粉刷匠 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2184 Solved: 1259[Submit][Statu ...
- P4158 [SCOI2009]粉刷匠(洛谷)
今天A了个紫(我膨胀了),他看起来像个贪心一样,老师说我写的是dp(dp理解不深的缘故QWQ) 直接放题目描述(我旁边有个家伙让我放链接,我还是说明出处吧(万一出处没有了)我讲的大多数题目都是出自洛谷 ...
- BZOJ1296: [SCOI2009]粉刷匠 DP
Description windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个 ...
- P4158[SCOI2009]粉刷匠
题目描述 windy有 N 条木板需要被粉刷. 每条木板被分为 M 个格子. 每个格子要被刷成红色或蓝色. windy每次粉刷,只能选择一条木板上一段连续的格子,然后涂上一种颜色. 每个格子最多只能被 ...
- [luogu4158 SCOI2009] 粉刷匠(dp)
传送门 Solution 把状态都记上暴力转移即可 Code //By Menteur_Hxy #include <queue> #include <cmath> #inclu ...
随机推荐
- 2017年值得学习的3个CSS特性
原文:https://bitsofco.de/3-new-css-features-to-learn-in-2017/译文:http://caibaojian.com/3-new-css-featur ...
- asp.net mvc +easyui 实现权限管理(一)
权限是每个企业应用必须的模块,可以简单,也能比较复杂.目前我们公司的权限要求是 能管控页面.字段.按钮.以及数据权限. 正好公司的进销存系统权限模块由我负责.做完后做下记录是个不错的习惯,知识是慢慢积 ...
- 强网杯2018 pwn复现
前言 本文对强网杯 中除了 2 个内核题以外的 6 个 pwn 题的利用方式进行记录.题目真心不错 程序和 exp: https://gitee.com/hac425/blog_data/blob/m ...
- 用JS实现的常见几种排序算法
1.快速排序法 function quickSort(a) { if (a.length <= 1) { return a; } var midLength = Math.floor(a.len ...
- python读取shp
sf = shapefile.Reader("res2_4m.shp") records = sf.records() print sf.fields for record in ...
- git下配置github sshkey
教程看这里 http://xiaxveliang.blog.163.com/blog/static/29708034201341244759225/
- 实用vim 130+命令
基本命令 :e filename Open filename for edition :w Save file :q Exit Vim :q! Quit without saving :x Write ...
- Apache服务器如何通过.htaccess文件设置防盗链?
Apache服务器通过.htaccess文件设置防盗链 用户经常面对的一个问题就是服务器的流量问题,而站点文件被盗链是其中最为主要的部分.所谓盗链,是指其他网站直接链接我们网站上的文件,一般来说,盗链 ...
- [控件] LabelView
LabelView 此LabelView是用来将Label显示在固定的View上的,需要计算Label的高度与宽度. 源码: NSString+StringHeight.h 与 NSString+St ...
- Mysql--通俗易懂的左连接、右连接、内连接
刚开始看书的时候花了好长时间理解 先通俗易懂的描述下: left join(左联接): 返回包括左表中的所有记录和右表中联结字段相等的记录. right join(右联接): 返回包括右表中的所有记录 ...