CF1114D Flood Fill(DP)
题目链接:CF原网
题目大意:$n$ 个方块排成一排,第 $i$ 个颜色为 $c_i$。定义一个颜色联通块 $[l,r]$ 当且仅当 $l$ 和 $r$ 之间(包括 $l,r$)所有方块的颜色相同。现在你可以选定一个起始位置 $p$,每次将 $p$ 所在颜色联通块的所有方块颜色改成另一种。这个操作可能将两个颜色联通块合并成一个。问最少要多少步,能让 $[1,n]$ 变成一个颜色联通块。
$1\le n,c_i\le 5000$。
其实是个很水的区间DP啊……为什么会有同学说不做呢……
毕竟我能在考场上想到的DP能是难题吗……
根据定义,$p$ 所在的颜色联通块就是一个区间。而且这个区间只会往外扩张,不会往里收缩。
那就轻松的DP了。
首先把一开始就是联通块的压成一块,不影响答案,而且会使下面的DP更快。比如,$5\ 3\ 3\ 1\ 4\ 4\ 2\ 4$ 可以压缩成 $5\ 3\ 1\ 4\ 2\ 4$。
(下面假设压缩后长度为 $m$)
令 $dp_{l,r}$ 表示目前 $[l,r]$ 是包含起始位置的极长颜色联通块(也就是不被其它联通块包含),需要将 $[1,m]$ 变为同色的还需要的最小步数。
起始状态:$dp_{1,m}=0$。
答案是所有 $dp_{i,i}$ 的最小值。
转移:如果一个联通块要变色,那么只有可能变成 $l-1$ 的颜色或者 $r+1$ 的颜色。
$l\neq 1$ 时,$dp_{l,r}=\min(dp_{l,r},dp_{l-1,r}+1)$。
$r\neq m$ 时,$dp_{l,r}=\min(dp_{l,r},dp_{l,r+1}+1)$。
注意还要判断 $l-1$ 和 $r+1$ 颜色相同:
$l\neq 1,r\neq m$ 且 $c_{l-1}=c_{r+1}$ 时,$dp_{l,r}=\min(dp_{l,r},dp_{l-1,r+1}+1)$。
时间复杂度 $O(n^2)$。
代码中我用的是记忆化搜索。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> PII;
const int maxn=;
#define MP make_pair
#define PB push_back
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
char ch=getchar();int x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,a[maxn],m,b[maxn],f[maxn][maxn];
int solve(int l,int r){
if(l== && r==m) return ;
if(f[l][r]) return f[l][r];
int ans=INT_MAX;
if(l!=) ans=min(ans,solve(l-,r));
if(r!=m) ans=min(ans,solve(l,r+));
if(l!= && r!=m && b[l-]==b[r+]) ans=min(ans,solve(l-,r+));
return f[l][r]=ans+;
}
int main(){
n=read();
FOR(i,,n){
a[i]=read();
if(a[i]!=a[i-]) b[++m]=a[i];
}
int ans=INT_MAX;
FOR(i,,m) ans=min(ans,solve(i,i));
printf("%d\n",ans);
}
CF1114D Flood Fill(DP)的更多相关文章
- Codeforces1114 D. Flood Fill (DP)(整个区间染成同色)
题意:连续的几个颜色相同的格子称为一个连通块.选一个点为起点,每个操作是把所在连通块变一个颜色,求把整个区间染成同色需要的最少操作数.(注意,每次只能改变所在连通块的颜色,不能任选连通块,除了最开始时 ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- 初探动态规划(DP)
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...
- Tour(dp)
Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)
.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...
- Leetcode之动态规划(DP)专题-详解983. 最低票价(Minimum Cost For Tickets)
Leetcode之动态规划(DP)专题-983. 最低票价(Minimum Cost For Tickets) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...
随机推荐
- [python][spark]wholeTextFiles 读入多个文件的例子
$pwd /home/training/mydir $cat file1.json {"firstName":"Fred", "lastName&qu ...
- P4099 [HEOI2013]SAO
P4099 [HEOI2013]SAO 贼板子有意思的一个题---我()竟然没看题解 有一张连成树的有向图,球拓扑序数量. 树形dp,设\(f[i][j]\)表示\(i\)在子树中\(i\)拓扑序上排 ...
- RabbitMQ 发布订阅-实现延时重试队列(参考)
RabbitMQ消息处理失败,我们会让失败消息进入重试队列等待执行,因为在重试队列距离真正执行还需要定义的时间间隔,因此,我们可以将重试队列设置成延时处理.今天参考网上其他人的实现,简单梳理下消息延时 ...
- Microsoft Office软件自定义安装目录
Microsoft Office安装时不能手动设置安装目录,本文描述通过修改注册表的方式自定义安装目录 1.同时按下快捷键 win + r 启动运行 2.输入 regedit 打开注册表 3.找到 ...
- 手机APP自动化之uiautomator2 +python3 UI自动化
题记: 之前一直用APPium直到用安卓9.0 发现uiautomatorviewer不支持安卓 9.0,点击截屏按钮 一直报错,百度很久解决方法都不可以,偶然间看见有人推荐:uiautomator ...
- windows 脚本
sudo.vbs http://blog.csdn.net/qidi_huang/article/details/52242053 c:\windows\sudo.vbs 'ShellExecute ...
- curator 分布式锁InterProcessMutex
写这篇文章的目的主要是为了记录下自己在zookeeper 锁上踩过的坑,以及踩坑之后自己的一点认识; 从zk分布式锁原理说起,原理很简单,大家也应该都知道,简单的说就是zookeeper实现分布式锁是 ...
- QQ的小秘密
http://ssl.ptlogin2.qq.com/test http://ping.huatuo.qq.com/ http://localhost.ptlogin2.qq.com:4300/mc_ ...
- activiti 工作流 动态 设置 指定 节点任务人、责任人、组 的实现方式
首先给大家看一下我的流程图: 流程文件leaveBill.bpmn <?xml version="1.0" encoding="UTF-8"?>&l ...
- python pip包安装以及几个包的简单用法
1. centos74 安装完之后默认有python2.7.5 但是没有pip需要自己安装: copy from https://www.cnblogs.com/rain124/p/6196053.h ...