题解:一道DP,不算简单也不算难,做过类似的话会有一些想法

37--NYOJ回文字符串_c++

i/j

A

b

3

b

d

d

0

0

0

0

1

b

0

1

1

1

1

3

0

1

2

2

2

b

0

1

2

3

3

A

1

1

2

3

3

画一下图研究一下结果:

找出动态转移方程 if s[i]==str[j]说明有一个相同的,说明当前
的公共长度为dp[i-1][j-1]+1

AC代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn 1005
char s[maxn],str[maxn];
int dp[maxn][maxn];
int len;
void init()
{
len=strlen(s+1);
int j=1;
for(int i=len; i>=1; i--,j++)
{
str[j]=s[i];
}
}
void s_dp()
{
for(int i=1; i<=len; i++)
{
for(int j=1; j<=len; j++)
{
if(s[i]==str[j])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
//return dp[len][len];
}
int main()
{

int t;
scanf("%d",&t);
while(t--)
{
memset(s,0,sizeof(s));
memset(str,0,sizeof(str));
memset(dp,0,sizeof(dp));
scanf("%s",s+1);
init();
s_dp();
int ans=len-dp[len][len];
printf("%d\n",ans);
}

}