1. 程式人生 > >【poj 1159】Palindrome 題意&題解&程式碼(C++)

【poj 1159】Palindrome 題意&題解&程式碼(C++)

題目連結:
http://poj.org/problem?id=1159
題意:
給出一個長為n的字串,求最少新增幾個字元可以將這個字串變為迴文字串。
題解:
要把這個串變為迴文串,很容易想到從串中間往兩邊暴力比較左右字元是否相等,發現兩邊字元不相等就新增,換句話說就是求這兩邊的字串的最長公共子序列的長度,求出之後用長度減掉(2×長度 +1)即為答案,但這樣似乎有些麻煩,進一步想到串左半部分與右半部分的最長公共子序列的2倍加1,即為此串與其逆串的最長公共子序列的長度,於是此題就轉化為了裸地求兩個字串的最長公共子序列,5000*5000的陣列會mle,用滾動陣列優化即可。
程式碼:

#include<iostream>
#include<algorithm> #include<stdio.h> #include<string.h> using namespace std; int tot,n,dp[5][5005]; char a[5005],b[5005]; int main() { scanf("%d",&n); scanf("%s",a+1); for (int i=n;i>=1;i--) tot++,b[tot]=a[i]; dp[0][0]=0; for (int i=1;i<=n;i++) for (int
j=1;j<=n;j++) { if (a[i]==b[j]) dp[i%2][j]=dp[(i-1)%2][j-1]+1; else dp[i%2][j]=max(dp[(i-1)%2][j],dp[i%2][j-1]); } cout<<n-dp[n%2][n]<<endl; }