計蒜客習題:迴文串
問題描述
一個字串如果從左往右讀和從右往左讀都一樣,那麼這個字串是一個迴文串。例如:”abcba”,”abccba”。
蒜頭君想通過新增字元把一個非迴文字串變成迴文串。例如:”trit”,可以新增一個’i’ 變成迴文串”tirit”。請你用程式計算出,對於一個給定的字串,最少需要新增幾個字元,才能變成迴文串。
輸入格式
輸入一個長度為n(1≤n≤3000) 的字串。(字串只包含字母)
輸出格式
輸出最少需要新增的字元個數,佔一行。
樣例輸入
trit
樣例輸出
1
AC程式碼
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char a[3010];
char b[3010];
int lcs[3010][3010];
int main()
{
memset(lcs,0,sizeof(lcs));
int n=1;
char x;
while(scanf("%c",&x)==1&&x!=10)
{
a[n]=x;
n++;
}
n--;
for(int i=1;i<=n;i++)
{
b[n-i+1 ]=a[i];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i]==b[j])lcs[i][j]=lcs[i-1][j-1]+1;
else lcs[i][j]=max(lcs[i-1][j],lcs[i][j-1]);
}
}
cout<<n-lcs[n][n];
return 0;
}