链接
题意
这是一个类似于祖玛的游戏,你有一个长度为\(\text{N}\)的序列\(c\),序列中一个联通块可以消去(即删除,类似消一消,只能一个联通块一个联通块的消去),一个联通块即是一个连续的子序列,且该子序列是回文的,一个联通块被消去就不存在了,问最少需要消几次。
数据范围:\(1\le N \le 500,1\le c_i\le N\).
分析
这是一道区间\(dp\)的题目;这道题的原型是括号序列;
对于一个序列,对于它的区间长度为\(len\)的阶段,区间长度小于\(len\)的阶段的所有状态,我们已经求出来了,之后对于阶段\(len\),我们枚举起始点\(i、j\),对于区间\([i,j]\),需要枚举划分点\(k\),如果找到满足\(c[i]==c[k]\)的\(k\),那么就有\(dp[i][j]=\min\{dp[i][j],dp[i][k]+dp[k+1][j]\}\),另外我们还需要考虑一种特殊情况,对于区间长度为\(2\),如果是回文串,我们需要额外判断一下。
对于初始状态\(dp[i][i]=0\),其他为\(\infty\).
代码
1 |
|