【题解】洛谷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 ...
随机推荐
- ubuntu下使用python3的有些库时,解决"raise ImportError(str(msg) + ', please install the python3-tk package') ImportError: No module named '_tkinter', please install the python3-tk package"的错误
问题: 在Ubuntu下使用matplotlib这个库时,运行时出现如下错误: raise ImportError(str(msg) + ', please install the python3-t ...
- 润乾报表html代码填报
由于html和富文本类型的单元格,不能进行可写操作,如果要想填报时填入html代码并且提交后更新就要换了一个方法,通过数据回填的方法. 比如在C3单元格设置html事件(也可以通过一个按钮来触发 ...
- spring boot(13)-logback和access日志
logback logback出自log4j的作者,性能和功能相比log4j作出了一些改进,而配置方法和log4j类似,是spring boot的默认日志组件.在application.propert ...
- Oracle EBS 跳跳转标准销售订单程序转标准销售订单程序
-- 打开PO PROCEDURE Btn_Open_Po IS BEGIN Fnd_Function.Execute(Function_Name => 'PO_POXPOEPO', Open_ ...
- JS弹出div简单样式
<div id="dialog" style="display:none;z-index:9999;position: absolute;border:1px so ...
- linux下yum安装指定的mysql版本
因为直接使用yum安装的mysql会是默认版本5.1的版本 但是有的同学不满足又想要其他版本的怎么办呢? 曾时候我来提供一种方案(仅供参考): 我们可以使用rpm包来进行指定mysql版本的安装, ...
- 使用 Versions for mac 进行版本控制
刚开始折腾 xcode 5.1 自己的svn版本控制,应该很好用,但是用不好,搞了半天也没法把工程传到svn服务器上去. 在 xcode 5.1 Soure Control 中弄 点击 Check O ...
- 微信自定义菜单的emoji图标
微信公众号自定义菜单添加emoji表情图标 第一步:打开微信公众平台接口调试工具,点击前往接口调试工具: 第二步:把这段代码 {"button":[{"sub_butt ...
- Oracle Order By 排序 非主键时 紊乱 重复 问题
Oracle的分页查询是没有进行任何排序操作的,Oracle是顺序的从数据块中读取符合条件的数据返回到客户端. 而Oracle的排序算法不具有稳定性,也就是说,对于排序键值相等的数据,这种算法完成排序 ...
- python-面向过程编程
面向过程: 核心是过程.过程指的是解决问题的步骤,设计一条流水线,机械式的思维方式. 优点:复杂的问题流程化,进而简单化