-
思想
状态:
dp[i][j]:表示S[i]到S[j]是否是回文串,是为1,不是为0
状态转移方程:
dp[i][j] = dp[i+1][j-1] ,S[i]==S[j]
dp[i][j] = 0, ,S[i]!=S[j]
1.边界:dp[i][i] = 1,dp[i][i+1] = (S[i] == S[i+1]) ? 1:0
2.枚举:不能够使用连续枚举的方法(这样有的状态没法转移),
使用新的枚举方法:长度进行枚举,边界的长度为1或2,长度从L = k(K>=3)开始枚举(利用L = K-1)这样所有的状态都能够转移 -
代码实现
#include<stdio.h>
#include<string.h>
const int maxn = 1000;
char S[maxn];
int dp[maxn][maxn];
int main()
{
int ans = 0;
int i,j;
int L;
gets(S);
memset(dp,0,sizeof(dp));
int len = strlen(S);
//边界
for(i = 0;i + 1 < len;i++)
{
dp[i][i] = 1;
if(S[i] == S[i+1])
{
dp[i][i+1] = 2;
ans = 2;
}
}
//状态转移
for(L = 3;L<=len;L++)
{
for(i = 0;i+L-1<len;i++)
{
j = i + L - 1;
if(S[i] == S[j] && dp[i+1][j-1] == 1)
{
dp[i][j] = 1;
ans = L;
}
else
{
dp[i][j] = 0;
}
}
}
printf("%d\n",ans);
return 0;
}
/*
IN:
PATZJUJZTACCBCC
OUT:
9
*/