标签:cin puts int 回文 class lcs 判断 答案 添加
试题描述
|
所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。现在
要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。 |
输入格式
|
一个字符串,长度不超过1000.
|
输出格式
|
每行输出所需添加的最少字符数
|
输入示例
|
Ab3bd
|
输出示例
|
2
|
【分析】
s2是与s1相反的字符串,只要求出s1与s2的lcs,再拿总长度减去这个值即是答案。
我之前推出来的ans=min{len-2*dp[i][n-i-1]-1, len-2*dp[i][n-i]}不知道为什么打死只能80..
【代码】
1 #include <iostream> 2 #include <cstring> 3 #include <string> 4 #include <algorithm> 5 using namespace std; 6 7 string s1, s2; 8 9 int dp[1001][1001], len, ans=0x7fffffff; 10 11 int main() { 12 cin >> s1; 13 int len=s1.length(); 14 s2=s1; 15 s1=" "+s1; 16 s2=" "+s2; 17 for (int i=1;i<=len;++i) 18 s2[len-i+1]=s1[i]; 19 for (int i=1;i<=len;++i) 20 for (int j=1;j<=len;++j) 21 if (s1[i]==s2[j]) 22 dp[i][j]=max(dp[i][j], dp[i-1][j-1]+1); 23 else 24 dp[i][j]=max(dp[i][j-1], dp[i-1][j]); 25 for (int i=2;i<len;++i) 26 ans=min(ans, len-2*dp[i][len-i-1]-1); 27 cout << ans << endl; 28 }
标签:cin puts int 回文 class lcs 判断 答案 添加
原文地址:http://www.cnblogs.com/shamman/p/7291957.html