【题解】洛谷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 ...
随机推荐
- Myeclipse打war包方法
Myeclipse三种打包方法第一种方法打开Myeclipse如图操作. 如果该项目已存在需要移除之后在进行第三步,接着往下走. 项目打war包成功,推荐使用第一种方法. 第二种方法https://b ...
- Keras & Theano 输出中间层结果
Keras & Theano get output of an intermediate layer 1.使用函数模型API,新建一个model,将输入和输出定义为原来的model的输入和想要 ...
- MVP 模式简单易懂的介绍方式
为什么用Android MVP 设计模式? 当项目越来越庞大.复杂,参与的研发人员越来越多的时候,MVP 模式 的优势就充分显示出来了. MVP 模式是 MVC 模式在 Android 上的一种变体, ...
- Flutter隐藏控件方法
new Offstage( offstage: true, //这里控制 child: Container(color: Colors.blue,height: 100.0,), ),
- linux 获取shell内置命令帮助信息 help xx
shell,命令解释器 shell内置命令有cd/umask/pwd等 help shell内置命令适用于所有用户获取shell内置命令的帮助信息help umaskhelp if
- shell黑名单
#/bin/bash netstat -ant | " | awk '{print $5}' | grep -v "^10" | cut -d ":" ...
- MySQL无法启动、服务没有报告任何错误&初次登陆错误的解决
先以管理员身份运行cmd(右键单击左下角win菜单) 输入mysqld -install,net start mysql,下图是返回结果.报错情况以及修正之后的全过程 启动失败之后输入mysqld - ...
- Sql Server tempdb原理-启动过程解析实践
我们知道在SqlServer实例启动过程中数据库会进行还原(Redo,Undo)然后打开提供服务,但我们知道tempdb是不提供重做机制的(Redo)那tempdb是如何还原的呢?如果tempdb损坏 ...
- 洛谷P1064 金明的预算方案
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱就行”. ...
- Jmeter入门--安装教程
jmeter简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 它可以用于测试静态和动 ...