题目:http://codeup.cn/problem.php?cid=100000629&pid=0
解题思路:
dp[i][j]=1表示s[i]到s[j]所表示的子串是回文串,否则为0
边界:
状态转移方程:
本题中用到库函数,isalpha,isdigit,且输入中除了空格和标点符号外的字符还可能有数字!!
详情参考代码
ac代码:
#include <iostream>
#include <cstring>
#define maxn 5005
#define inf 2147483648
using namespace std;
typedef long long ll;
int dp[maxn][maxn];
int main()
{
//freopen("/Users/zhangkanqi/Desktop/11.txt","r",stdin);
memset(dp,0,sizeof(dp));
int pos[maxn];
string a,b;
getline(cin,a);
int len1=a.size(),j=0;
for(int i=0;i<len1;i++)
{
if(isalpha(a[i]))
{
b[j]=toupper(a[i]);
pos[j++]=i;
}
else if(isdigit(a[i]))
{
b[j]=a[i];
pos[j++]=i;
}
}
int len2=j,ans=1,k=0;
for(int i=0;i<len2;i++)
{
dp[i][i]=1;
if(b[i]==b[i+1])
{
dp[i][i+1]=1;
ans=2;
}
}
for(int L=3;L<=len2;L++)
{
for(int i=0;i+L-1<len2;i++)
{
int j=i+L-1;
if(dp[i+1][j-1]&&b[i]==b[j])
{
dp[i][j]=1;
if(L>ans)
{
ans=L;
k=i;
}
}
}
}
for(int i=pos[k];i<=pos[k+ans-1];i++)
printf("%c",a[i]);
return 0;
}