UVa:10739 String to Palindrome

其实对于一个字符串第一个和最后一个字符不同的情况下,只有三种操作,删除第一个,删除最后一个,或者替换其中一个。这样对应三种递归方式。当然如果第一个和最后一个相同,那么直接递归不包括这俩字符的串即可。

当只有一个字符或者两个字符而且成为回文的时候终止递归,返回值为0。

不难写。

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define ll long long
#define MAXN 1005
#define INF 2139062143
using namespace std;
char str[MAXN];
int dp[MAXN][MAXN];
int L;
int solve(int a,int b)
{
    if(a<=b)
    {
        if(a==b||(a+1==b&&str[a]==str[b])) return dp[a][b]=0;
        if(dp[a][b]!=INF) return dp[a][b];
        if(str[a]!=str[b])
        {
            dp[a][b]=min(solve(a+1,b)+1,dp[a][b]);
            dp[a][b]=min(solve(a,b-1)+1,dp[a][b]);
            dp[a][b]=min(solve(a+1,b-1)+1,dp[a][b]);
        }
        else dp[a][b]=min(solve(a+1,b-1),dp[a][b]);
        return dp[a][b];
    }
    return INF;
}
int main()
{
    int T,kase=0;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s",str);
        memset(dp,0x7f,sizeof(dp));
        L=strlen(str)-1;
        int ans=solve(0,L);
        printf("Case %d: %d\n",++kase,ans);
    }
    return 0;
}


 

你可能感兴趣的:(动态规划)