51Nod_1092 回文字符串
http://www.51nod.com/Challenge/Problem.html#!#problemId=1092
题目
回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。每个字符串都可以通过向中间添加一些字符,使之变为回文字符串。例如:abbc 添加2个字符可以变为 acbbca,也可以添加3个变为 abbcbba。方案1只需要添加2个字符,是所有方案中添加字符数量最少的。
输入
输入一个字符串Str,Str的长度 <= 1000。
输出
输出最少添加多少个字符可以使之变为回文字串。
样例输出
abbc
样例输入
2
分析
设s2是s1的逆序字符串,那么要让s1变为回文字符串最少添加字符的个数=s1.length - LCS(s1,s2).。原因是只要在字符不同地方添加字符,使其相同即可。
C++程序
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int dp[1003][1003];
int LCS(string s1,string s2)//动态规划求最长公共子序列
{
int ans=0;
memset(dp,0,sizeof(dp));
for(int i=0;i<s1.length();i++)
for(int j=0;j<s2.length();j++){
if(s1[i]==s2[j])
dp[i+1][j+1]=dp[i][j]+1;
else
dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
ans=max(ans,dp[i+1][j+1]);
}
return ans;
}
int main()
{
string s1,s2;
getline(cin,s1);
if(s1==""){
cout<<"0"<<endl;
return 0;
}
s2=s1;
for(int i=0;i<s1.length();i++)
s2[s1.length()-i-1]=s1[i];
cout<<s1.length()-LCS(s1,s2)<<endl;
return 0;
}