POJ-1159 Palindrome---變成回文串的最小代價
阿新 • • 發佈:2018-05-08
%s targe OS AS 回文字符串 最長公共子序列 span color problem
題目鏈接:
https://cn.vjudge.net/problem/POJ-1159
題目大意:
題意很明確,給你一個字符串,可在任意位置添加字符,最少再添加幾個字符,可以使這個字符串成為回文字符串。
解題思路:
設原序列S的逆序列為S‘
最少需要補充的字母數 = 原序列S的長度 — S和S‘的最長公共子序列長度
采用滾動數組節省空間
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 using namespace std;6 const int maxn = 1e4 + 10; 7 char s1[maxn], s2[maxn]; 8 int dp[2][maxn], n; 9 int main() 10 { 11 scanf("%d", &n); 12 scanf("%s", s1); 13 for(int i = 0; i < n; i++) 14 s2[i] = s1[n - 1 - i]; 15 for(int i = 0; i < n; i++) 16 { 17 for(int j = 0; j < n; j++)18 { 19 int now = (i + 1) & 1; 20 if(s1[i] == s2[j]) 21 dp[now][j + 1] = dp[!now][j] + 1; 22 else dp[now][j + 1] = max(dp[!now][j + 1], dp[now][j]); 23 } 24 } 25 cout<<n - dp[n&1][n]<<endl; 26 return 0;27 }
POJ-1159 Palindrome---變成回文串的最小代價