您的位置:首页 > 其它

POJ 1159 && HDU 1513 Palindrome(LCS)

2015-08-23 14:59 411 查看
Description

给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串

Input

第一行一个整数n表示字符串长度(n<=5000),第二行一个字符串

Output

输出能使原字符串变为回文字符串最少需要添加几个字符

Sample Input

5

Ab3bd

Sample Output

2

Solution

设原序列S的逆序列为S’,则最少需要补充的字母数=原序列S的长度-S和S’的最长公共子串长度,故转化为LCS问题

注意:本题空间开销较大,需特殊处理,下面给出两种节省空间的方法

1.静态数组(用short int)

2.滚动数组

Code

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF (1<<29)
#define maxn 5005
char s1[maxn],s2[maxn];
int n;
int dp[2][maxn];
int main()
{
while(~scanf("%d%s",&n,s1))
{
for(int i=0;i<n;i++)//求逆串
s2[n-i-1]=s1[i];
memset(dp,0,sizeof(dp));//初始化
for(int i=0;i<n;i++)//LCS
for(int j=0;j<n;j++)
{
if(s1[i]==s2[j])
dp[(i+1)%2][j+1]=dp[i%2][j]+1;
else
dp[(i+1)%2][j+1]=max(dp[i%2][j+1],dp[(i+1)%2][j]);
}
cout<<n-dp[n%2]
<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: