UVa:11151 Longest Palindrome

最长回文串问题。因为吞键盘的getsWA了好几次。

 

记忆化搜索+动规。

dp【i】【j】表示以i为左端点j为右端点的字符串中最长回文串长度。

 注意这里的回文串不一定要连续。

空串输出0,所以要用gets读。

 

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
char str[1005];
int dp[1005][1005];
int solve(int st,int ed)
{

    if(dp[st][ed]!=-1) return dp[st][ed];
    if(st>ed)return 0;
    if(st==ed)return 1;
    if(str[st]==str[ed])
        dp[st][ed]=solve(st+1,ed-1)+2;
    else
        dp[st][ed]=max(solve(st+1,ed),solve(st,ed-1));
    return dp[st][ed];

}
int main()
{
    int T;
    scanf("%d",&T);
    getchar();
    while(T--)
    {
        gets(str);
        memset(dp,-1,sizeof(dp));
        int ans=solve(0,strlen(str)-1);
        printf("%d\n",ans);
    }
    return 0;
}


 

你可能感兴趣的:(动态规划,记忆化搜索,最长回文串)