博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【题解】洛谷P4158 [SCOI2009] 粉刷匠(DP)
阅读量:5116 次
发布时间:2019-06-13

本文共 934 字,大约阅读时间需要 3 分钟。

次元传送门:

思路

f[i][j][k][0/1]表示在坐标为(i,j)的格子 已经涂了k次 (0是此格子涂错 1是此格子涂对)涂对的格子数

显然的是 每次换行都要增加一次次数

那么当j=1时:

f[i][j][k][1]=max(f[i-1][m][k-1][1],f[i-1][m][k-1][0])+1;//可以从前一排最后一个转移过来 记得+1f[i][j][k][0]=max(f[i-1][m][k-1][1],f[i-1][m][k-1][0]);//同理 不用+1

当j>1时分成两种情况

  • 当第i格和第i-1格相同
f[i][j][k][1]=f[i][j-1][k][1]+1;//最优为前一个不换方案即可+1 因为同色f[i][j][k][0]=max(f[i][j-1][k][0],f[i][j-1][k-1][1]);//如果不对的话 就要从前面也错不换刷子或者前面对换刷子中取最大值
  • 当第i格和第i-1格不同
f[i][j][k][1]=max(f[i][j-1][k-1][1]+1,f[i][j-1][k][0]+1);//当前是对的可以从前面是对的但是换刷子或者前面是错的不换刷子中来 记得+1f[i][j][k][0]=max(f[i][j-1][k][1],f[i][j-1][k-1][0]);//当前是错的可以从前面是对的不用换刷子或者前面是错的但是换刷子中来 不用+1

每次查找都要取ans

因为有可能在任意一格停下

代码

#include
using namespace std;#define maxn 55int n,m,t,ans;int map[maxn][maxn];int f[maxn][maxn][maxn*maxn][2];int main(){ cin>>n>>m>>t; for(int i=1;i<=n;i++)//输入操作 { string s; cin>>s; for(int j=0;j

 

转载于:https://www.cnblogs.com/BrokenString/p/9917111.html

你可能感兴趣的文章
【BZOJ1565】 植物大战僵尸
查看>>
VALSE2019总结(4)-主题报告
查看>>
浅谈 unix, linux, ios, android 区别和联系
查看>>
51nod 1428 活动安排问题 (贪心+优先队列)
查看>>
中国烧鹅系列:利用烧鹅自动执行SD卡上的自定义程序(含视频)
查看>>
Solaris11修改主机名
查看>>
latex for wordpress(一)
查看>>
如何在maven工程中加载oracle驱动
查看>>
Flask 系列之 SQLAlchemy
查看>>
aboutMe
查看>>
【Debug】IAR在线调试时报错,Warning: Stack pointer is setup to incorrect alignmentStack,芯片使用STM32F103ZET6...
查看>>
一句话说清分布式锁,进程锁,线程锁
查看>>
python常用函数
查看>>
FastDFS使用
查看>>
服务器解析请求的基本原理
查看>>
[HDU3683 Gomoku]
查看>>
【工具相关】iOS-Reveal的使用
查看>>
数据库3
查看>>
存储分类
查看>>
下一代操作系统与软件
查看>>