1. 程式人生 > >Laoj P1285 回文詞(ioi2000)

Laoj P1285 回文詞(ioi2000)

ios 問題 格式 cnblogs 之前 clu cst length 推出

試題描述
所謂回文字符串,就是一個字符串,從左到右讀和從右到左讀是完全一樣的,比如"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 }

Laoj P1285 回文詞(ioi2000)