37--NYOJ回文字符串
原创
©著作权归作者所有:来自51CTO博客作者mb5c5a77ee6227c的原创作品,请联系作者获取转载授权,否则将追究法律责任
题解:一道DP,不算简单也不算难,做过类似的话会有一些想法
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);
}
}