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) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...
随机推荐
- (代码篇)从基础文件IO说起虚拟内存,内存文件映射,零拷贝
上一篇讲解了基础文件IO的理论发展,这里结合java看看各项理论的具体实现. 传统IO-intsmaze 传统文件IO操作的基础代码如下: FileInputStream in = new FileI ...
- Scrum与看板区别
看板:在制品(work-in-progress, WIP)必须被限制 WIP上限和拉动式生产 1. Scrum与看板简述 Scrum:组织拆分,工作拆分,开发时间拆分,优化发布计划,过程优化 看板 ...
- tableView优化思路
一般优化的思路: 提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法. 复杂界面可采用异步绘制. 在大量图片展示时,可以滑动时按需加载. 尽量少用或不 ...
- 先埋锅-CF-Valid BFS?-差一点没交上
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...
- HashMap和HashTable区别【转载】
今天看到的HashMap和HashTable区别介绍,收藏留着学习. 出处:http://www.importnew.com/24822.html 代码版本 JDK每一版本都在改进.本文讨论的Hash ...
- 小学四则运算APP 第三阶段冲刺-第一天
团队成员:陈淑筠.杨家安.陈曦 团队选题:小学四则运算APP 第三次冲刺阶段时间:12.12~12.19 本次发布的是音乐播放功能,可以根据用户需求一边播放音乐一边做题,也拥有暂停播放音乐的功能,增强 ...
- C#改变图片大小
今天一女同事要做一个改变图片大小的功能,然后我就手写了几行代码,以后可能用得上 byte[] buffer = new byte[1]; //Byte转为Image对象 MemoryStream ms ...
- 毕业设计心得与整理-APP-主题切换
1.定义主体颜色: 在style自定义了三个属性: <item name="textLight">@android:color/white</item> & ...
- Linux安装的分区问题
对于一般的外部SATA存储设备,在ubuntu中会显示在/etc/sd*中,例如: SATA1插槽上的文件名:/dev/sda SATA5插槽上的文件名:/dev/sdb USB磁盘:/dev/sdc ...
- C++ cout执行顺序
C++ cout执行顺序 问题描述是这样的:如果在cout中调用函数,同时这个函数中包含输出语句,那么会先输出哪一句? 仔细一看,突然发现对C++的内容遗忘了,确实一下子看不出来输出的先后问题. 实现 ...