洛谷P2145

摘要:
2:f[1][cnt]);return0;}关于第十一个数据点,据说数据有误,所以需特判才可过当输出为3时改为2即可End.

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]|ile kle j}} ]

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

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

[{f[i][j]=min{f[i][j],f[i+1][j-1]+ egin{cases} 0&val[i]+val[j]>2\1&val[i]+val[j]le2end{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》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇数据字典管理思路富数据控件 GridView(模版)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

UOS怎么安装谷歌浏览器

这是安装完成的截图点击UOS左下角启动器图标,拉至最底下,找到“Chromium网页浏览器”,点击启动以下是启动的界面截图...

AntDesignVue中关于Table组件的使用

--下面这整个div都是设置每一列搜索的样式图标--˃searchInput=c":placeholder="`Search${column.dataIndex}`":value="selectedKeys[0]"@change="e=˃setSelectedKeys(e.target.value?...

Windows Server 2008 R2 备份与恢复详细实例

Windows ftp服务可以在百度内置,非常简单。)1.首先安装windows server 2008R2的备份功能。查找Windows的“服务器管理器”。下图显示了我的服务器的情况。双击它。备份完成后,我们卸载qq并删除磁盘F的数据。Linux服务器在没有密码的情况下构建Samba登录,并使用yum进行安装。...

Cesium深入浅出之视频投影【转】

通常,我们使用矩形,因为视频形状是方形的。据怀疑,视频标签隐藏了这段关系。如果再次显示,视频将再次移动。此处使用VideoSynchronizer。它可以使视频元素与铯的模拟时钟同步。让我们看看它的构造函数:name type description optionsObject option子属性:name type默认值description用于驱动视频的...

10 TCP限流技术

TCP流限制的原因是接收方可以完全接受消息,以确保数据安全而不会丢失。首先,窗口机制引入了发送方和接收方都有一个窗口。当发送方发送数据时,将发送落入窗口中的数据。当接收器接收到数据时,落入接收器窗口的数据将被接受。可以看出,流量会受到窗口大小II的限制。滑动窗口技术1TCP滑动窗口技术通过动态改变窗口大小来调整两台主机之间的数据传输。...

C# Winform Treeview控件

WinformTreeview控件目录手动添加节点。丰富节点数据并清除所有节点信息。选择指定的节点。函数GetAllTreeNodeWinformTreeview控件手动添加节点//在根节点下添加根节点和子节点TreeNodeCollectionRoot=treeView1.Nodes;TreeNodecurNode=根。添加(“良好”);curN(电流)...