1. 程式人生 > >POJ-1159 Palindrome---變成回文串的最小代價

POJ-1159 Palindrome---變成回文串的最小代價

%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---變成回文串的最小代價