【poj 1159】Palindrome 題意&題解&程式碼(C++)
阿新 • • 發佈:2019-02-12
題目連結:
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;
}