题意:求最长回文子串
思路:
用dp, dp[left][right] 代表了从left到right这个子串是不是回文子串。 利用这个状态能节省很多重复判断。
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<stack>
#include<vector>
#include<queue>
#include<string>
#include<map>
using namespace std;
#define INF 99999999
#define M 1005
int flagdp[M][M];
int len;
int fsym(char str[],int l,int r)
{
if(l<0|| r>=len )
return 0;
if(l==r||l == r + 1)
return 1;
if(flagdp[l][r] == 1)
return 1;
else if(flagdp[l][r] == -1)
return -1;
if(str[l] == str[r])
{
flagdp[l][r] = fsym(str,l+1,r-1);
}
else flagdp[l][r]=-1;
return flagdp[l][r];
}
int main()
{
int i,l,j,r,symlen,maxsymlen;
memset(flagdp,0,sizeof(flagdp));
char str[M];
cin.getline(str,M);
maxsymlen = 0;
len=strlen(str);
int flags;
for(i=0;i<len;i++)
{
for(j=len-1;j>=i;j--)
{
flags = fsym(str,i,j);
if(flags == 1 && maxsymlen< j - i + 1)
maxsymlen=j-i+1;
}
}
cout<<maxsymlen<<endl;
}