Description

给定一串数字,每个数字代表一种颜色

你可以向这个数字序列里加任意数字,每加一个视为一次操作

当你加入的数字和与它相连的同种数字不少于三个时,他们就会消除

消除后序列的两端自动靠拢合并

求使得整个序列完全消失的最少操作次数


Analysis

一道区间 DP

注意本题的几个点

  • 即使给出的序列中已经有连续的不少于三个的相同数字,也必须向其中再加入一个才能删去

  • 消除一段序列后,再靠拢的序列两端如果又可以拼出不少于三个的序列,此时是可以消去的

  • 如果还不明白,可以现在去玩一玩祖玛

考虑怎么表示想要消除某种数字的连续序列应该放几个数字

\(col[]\) 表示当前位置是那种数字

然后想办法把输入的连续同种数字填进同一个位置,\(val[]\)记录它的个数

因为将每连续的数字放到同一个位置并记录种类和数量后,对于消除某个数字连续的序列,就变成了消除他所在的那一个位置

而消除的方法就是使其数量大于等于三


Solution

\(f[i][j]\) 表示消除从第 \(i\) 个位置到第 \(j\) 个位置的序列需要的最少操作数

所以就有状态转移方程

\[{f[i][j]=\min\{f[i][j],f[i][k]+f[k+1][j]|i\le k\le j\}}
\]

而且上面说了消除完合并后的如果合法也会消除

因此判断一下,当 \(col[i]=col[j]\) 时

\[{f[i][j]=\min\{f[i][j],f[i+1][j-1]+ \begin{cases} 0&val[i]+val[j]>2\\1&val[i]+val[j]\le2\end{cases}\}}
\]

因为要取最小值,所以要有预处理

当数字的数量为1时,需要再放两个数字才能消除,所以 \(f[i][i]=1\)

同理,数字的数量 \(\ge\) 2 时,只需再放一个,此时 \(f[i][i]=2\)

剩下的赋为极大值便可


Code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#define maxn 510 using namespace std; int n,ans,cnt;
int col[maxn],val[maxn],f[510][510]; int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
return s*w;
} int Min(int x,int y){return x<y?x:y;} int main(){
n=read();
memset(f,63,sizeof f);
for(int i=1;i<=n;i++) col[i]=read(); for(int i=1;i<=n;i++){
if(i!=1&&col[i]==col[i-1]) val[cnt]++;//
else{col[++cnt]=col[i];val[cnt]=1;}
}
for(int i=1;i<=n;i++) f[i][i]=val[i]>1?1:2; for(int s=2;s<=cnt;s++){
for(int i=1,j=i+s-1;j<=cnt;i++,j++){
if(col[i]==col[j]) f[i][j]=Min(f[i][j],f[i+1][j-1]+(val[i]+val[j]>2?0:1));
for(int k=i;k<j;k++) f[i][j]=Min(f[i][j],f[i][k]+f[k+1][j]);
}
} printf("%d",f[1][cnt]-3==0?2:f[1][cnt]);
return 0;
}

关于第十一个数据点,据说数据有误,所以需特判才可过

当输出为 3 时改为 2 即可


End.

洛谷P2145的更多相关文章

  1. 洛谷 P2145 [JSOI2007]祖码

    题目描述 这是一个流行在Jsoi的游戏,名称为祖玛. 精致细腻的背景,外加神秘的印加音乐衬托,彷佛置身在古老的国度里面,进行一个神秘的游戏——这就是著名的祖玛游戏.祖玛游戏的主角是一只石青蛙,石青蛙会 ...

  2. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  3. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  4. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  5. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  6. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  7. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

  8. 洛谷P1538迎春舞会之数字舞蹈

    题目背景 HNSDFZ的同学们为了庆祝春节,准备排练一场舞会. 题目描述 在越来越讲究合作的时代,人们注意的更多的不是个人物的舞姿,而是集体的排列. 为了配合每年的倒计时,同学们决定排出——“数字舞蹈 ...

  9. 洛谷八月月赛Round1凄惨记

    个人背景: 上午9:30放学,然后因为学校举办读书工程跟同学去书城选书,中午回来开始打比赛,下午又回老家,中间抽出一点时间调代码,回家已经8:50了 也许是7月月赛时“连蒙带骗”AK的太幸运然而因同学 ...

随机推荐

  1. 支付业务优化else if 代码

    背景 最近在做项目的时候,需要接入支付.由于接入第三方支付而且还不知止一家,需要接入很多家.比如说支付宝.微信.富友支付等.每家支付都一个回调.现如今的代码,根据不同的第三方支付一大堆else if判 ...

  2. 【kinetic】操作系统探索总结(八)键盘控制

    如果尝试过前面的例子,有没有感觉每次让机器人移动还要在终端里输入指令,这也太麻烦了,有没有办法通过键盘来控制机器人的移动呢?答案室当然的了.我研究了其他几个机器人键盘控制的代码,还是有所收获的,最后移 ...

  3. Vue项目如何打包问题总结

    当我们将 vue 项目完成后,面临的就是如何将项目进行打包上线,放到服务器中.我使用的是 vue-cli(simple) 脚手架,所以就讲一下如何将项目进行打包,并放到 tomcat 上. 先来描述一 ...

  4. 循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志

    在一个系统的权限管理模块中,一般都需要跟踪一些具体的日志,ABP框架的系统的日志管理,包括登录日志.接口访问日志.实体变化历史日志,本篇随笔介绍ABP框架中这些日志的管理和界面处理. 1.系统登录日志 ...

  5. apply 和 call的用法、区别

    1.JavaScript中函数是对象的方法,如果一个函数不是js对象的方法那一定是全局对象的函数,每个函数的对象都有apply和call方法,即每个对象都有call and apply apply:调 ...

  6. 算法设计与分析 - 主定理Master theorem (分治法递推时间复杂度)

    英文原版不上了 直接中文 定义 假设有递推关系式T(n)=aT(n/b)+f(n) 其中n为问题规模 a为递推的子问题数量 n/b为每个子问题的规模(假设每个子问题的规模基本一样) f(n)为递推以外 ...

  7. 记一次使用Asp.Net Core WebApi 5.0+Dapper+Mysql+Redis+Docker的开发过程

    #前言 我可能有三年没怎么碰C#了,目前的工作是在全职搞前端,最近有时间抽空看了一下Asp.net Core,Core版本号都到了5.0了,也越来越好用了,下面将记录一下这几天以来使用Asp.Net ...

  8. 【渲染引擎】Blender的2021年最佳渲染引擎(上)

    Blender最终摆脱了"古怪的孩子"的装束,并穿上了更为严肃和受人尊敬的" 3D强者". 它已在业界获得广泛认可,许多工作室和艺术家正在将其纳入他们的产品线. ...

  9. LeetCode557 反转字符串中的单词 III

    给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序. 示例 1: 输入: "Let's take LeetCode contest" 输出: &q ...

  10. Openstack OCATA 安装环境说明(一) 未完成版本

    1 Openstack简介: 2 实验说明: 3 图例: 4 实验环境说明: 4.1 ) 网卡说明: 网卡名 网 段 连接方式 说明 eth0 10.10.5.0/24 仅主机网络 内部网络自动以IP ...