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) 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的 ...
随机推荐
- Codeforces 999D Equalize the Remainders (set使用)
题目连接:Equalize the Remainders 题意:n个数字,对m取余有m种情况,使得每种情况的个数都为n/m个(保证n%m=0),最少需要操作多少次? 每次操作可以把某个数字+1.输出最 ...
- libgdx学习记录26——Polygon多边形碰撞检测
libgdx中Math封装了Polygon这个类,它是由多个定点进行描述实现的,在进行物体间的碰撞时,物体轮廓有时候是不规则的,这时候可以用一个多边形勾勒出其大概的轮廓,对其进行模拟. Polygon ...
- TRIO-basic指令--MOVEMODIFY
Syntax: MOVEMODIFY(position) Parameters: position: Absolute position for the current move to complet ...
- 基本的排序算法C++实现(插入排序,选择排序,冒泡排序,归并排序,快速排序,最大堆排序,希尔排序)
博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/8529525.html特别不喜欢那些随便转载别人的原创文章又不给 ...
- 【评分】Alpha阶段
[评分]Alpha阶段 总结 按时交 - 有分 晚交 - 0分 迟交一周以上 - 倒扣本次作业分数 抄袭 - 倒扣本次作业分数 请大家回忆一下第一次作业的总结:http://www.cnblogs.c ...
- [2017BUAA软工]第0次博客作业
第一部分:结缘计算机 1.你为什么选择计算机专业?你认为你的条件如何?和这些博主比呢? 当初选择计算机专业作为自己报考大学的第一志愿,主要是看重了市场对于计算机行业人士的巨大需求,同时也感慨于计算机行 ...
- 百度AI--自然语言处理之Java开发
参数: public class APIConstants { //设置APPID/AK/SK public static final String APP_ID = "108***&quo ...
- Jfrog Artifactory jenkins 流水线使用docker的方式培训[暂未成功]
1. 创建jenkins的流水线 2. 创建artifactory的镜像仓库 3. 创建generic的仓库上传需要的 war包还有tar包. 4. 修改pipeline的 脚本 主要修改的地方. 修 ...
- C++的内存分区
C++的内存划分为栈区.堆区.全局区/静态区.字符串常量和代码区. 栈区 由系统进行内存的管理. 主要存放函数的参数以及局部变量.在函数完成执行,系统自行释放栈区内存,不需要用户管理.整个程序的栈区的 ...
- git忽略本地文件
一.忽略文件的常用方法 1.git通常在.gitignore文件进行配置,来忽略本地文件.但是这仅对于重来没有提交过的文件有效. 2.使用git update-index --skip-worktre ...