Palindrome
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5165 Accepted Submission(s): 1761
As an example, by inserting 2 characters, the string "Ab3bd" can be transformed into a palindrome ("dAb3bAd" or "Adb3bdA"). However, inserting fewer than 2 characters does not produce a palindrome.
這裏主要有一個迴文串的問題。一個序列的最長迴文子序列就是它和自己逆序的最長公共子序列(LCS)。
然後因爲5000太大了,開不了二維數組,所以我們可以用滾動數組,就是奇數偶數交叉記錄。因爲這個題只需要最後結果,所以中間過程被省去也沒有問題。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[2][5010];
char ch1[5010],ch2[5010];
int main()
{
int i,j,n;
while(~scanf("%d",&n))
{
memset(dp,0,sizeof(dp));
scanf("%s",ch1);
for(i=0;i<n;i++)
ch2[i]=ch1[n-i-1];
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(ch1[i-1]==ch2[j-1])
dp[i&1][j]=dp[(i-1)&1][j-1]+1;//用了位運算,也不知道節省的時間多不多=。=
else
dp[i&1][j]=max(dp[(i-1)&1][j],dp[i&1][j-1]);
}
}
printf("%d\n",n-dp[n&1][n]);
}
return 0;
}