POJ 1159--Palindrome(回文序列)
来源:互联网 发布:java ee插件下载 编辑:程序博客网 时间:2024/05/23 11:39
题目要求对于一序列至少加上多上字符能组成一个回文序列,可参考算法导论中LCS的DP证明方法。
设序列为a[i],b[i][j]为a[i]到a[j]组成的子串插入最少的字符构成的回文序列,设dp[i][j]为最少需要插入字符的数目。
首先证明b[i][j]的始终字符(肯定相同)必定是a[i],a[j]当中其中一个。
反证:若始终字符为x0,b[i][j] = x0 x1 ...xk a[i] ...a[i] xk ... x1 x0或者x0 x1 .. xk a[j] a[i] .. a[i] a[j] xk .. x1 x0,则我们剥离所有x字符,组成的序列是一个需要插入字符更少的b[i][j],矛盾。
- 若i =j,dp[i][j] = 0。
- 若a[i] = a[j],则dp[i][j] = dp[i+1][j-1]。同样用反证法,若dp[i][j] < dp[i+1][j-1],则我们可以去除b[i][j]两头的a[i](前面已证),得到一个由a[i+1]到a[j-1]新构成的回文序列,此新序列需要插入的字符数等于dp[i][j],且小于dp[i+1][j-1],矛盾。
- 若a[i] != a[j],假设b[i][j]的头尾字符为a[i],则我们去除头尾的a[i],得到一个由a[i+1]到a[j]新构成的回文序列,易知此序列为b[i+1][j],所以dp[i][j] = dp[i+1][j]+1;同理可证当b[i][j]的头尾为a[j]时,dp[i][j] = dp[i][j-1]+1。
- 由3可知,当a[i] != a[j]时,dp[i][j] = min{dp[i+1][j],dp[i][j-1]}+1。
根据转移方程,易知可以使用滚动数组优化内存。
注意:当j = i+1时,dp[i][j] = dp[i+1][i],若不使用滚动数组,等式右边的值会一直为0,正确。若使用滚动数组,则需要在每次输入更新时初始化滚动数组为0,因为不初始化会使用上次输入的数组值。
#include<cstdio>#include<cstring>#define maxN 6001#define _min(x,y) ((x)<(y)?(x):(y))int main(){ int i,j,N; char flag; char str[maxN]; short minNum[2][maxN]; while(~scanf("%d",&N)) { getchar(); gets(str); memset(minNum,0,sizeof(minNum)); flag = 1; for(i = N-1;i >= 0;i--) { for(j = i+1;j < N;j++) { if(str[i] == str[j]) minNum[flag][j] = minNum[!flag][j-1]; else minNum[flag][j] = _min(minNum[!flag][j],minNum[flag][j-1])+1; } flag = !flag; } printf("%d\n",minNum[!flag][N-1]); } return 0;}
0 0
- POJ 1159--Palindrome(回文序列)
- POJ 1159 Palindrome(动态规划:最长回文子序列)
- POJ 1159 Palindrome(最长回文子序列+滚动数组)
- POJ 1159 Palindrome(回文串,最长公共子序列)
- POJ-1159-Palindrome-回文-动态规划
- poj 1159 Palindrome(最长回文子串)
- ACM POJ 1159 Palindrome 回文词
- POJ 1159 Palindrome(字符串变回文:LCS)
- POJ 1159 Palindrome(LCS~~回文)
- poj 1159 Palindrome -- 回文串,动态规划
- (POJ 1159)Palindrome <最长公共子序列 / 滚动数组优化 / 记忆化搜索> 简单回文数
- poj 1159 Palindrome(最长公共子序列)
- poj 1159 Palindrome 最长公共子序列
- POJ 1159:Palindrome 最长公共子序列
- POJ - 1159 Palindrome 最长公共子序列
- POJ 3974 Palindrome 回文串
- poj 3974 Palindrome 最长回文
- poj 1153 Palindrome(回文字符串)
- 电容触摸屏驱动---基于FT5406
- Invalidate和postInvalidate的区别
- 黑马程序员_12_高新技术之反射
- Java NIO系列教程(十一) Pipe
- Java NIO系列教程(十二) Java NIO与IO
- POJ 1159--Palindrome(回文序列)
- Codeforces Round #250 (Div. 2) -B. The Child and Set
- subprocess子进程的杀死
- NYOJ 269--VF
- 我的《C陷阱与缺陷》读书笔记
- CentOS操作杂记
- C语言:位异或运算符
- COCOS2DX之类型强制转换~(亦为C++)
- strings命令