POJ-1159 Palindrome---变成回文串的最小代价
题目链接:
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 }
越努力,越幸运