题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=37
代码如下:
01.
#include<cstdio>
02.
#include<cstring>
03.
#include<algorithm>
04.
using
namespace
std;
05.
char
s1[1010];
06.
char
s2[1010];
07.
int
dp[1010][1010];
08.
int
main()
09.
{
10.
int
n;
11.
while
(
scanf
(
"%d"
,&n)!=EOF)
12.
{
13.
while
(n--)
14.
{
15.
scanf
(
"%s"
,s1);
16.
int
len=
strlen
(s1);
17.
for
(
int
i=len-1;i>=0;i--)
//求出正序和倒序的最长公共子序列,然后用总长度减去最长公共子序列的长度即是答案
18.
s2[len-i-1]=s1[i];
19.
memset
(dp,0,
sizeof
(dp));
20.
for
(
int
i=1;i<=len;i++)
21.
for
(
int
j=1;j<=len;j++)
22.
{
23.
if
(s1[i-1]==s2[j-1])
24.
dp[i][j]=dp[i-1][j-1]+1;
25.
else
26.
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
27.
}
28.
printf
(
"%d\n"
,len-dp[len][len]);
29.
}
30.
}
31.
return
0;
32.
}