UVa:10739 String to Palindrome

来源:互联网 发布:搜狗输入法网络不可用 编辑:程序博客网 时间:2024/05/16 07:41

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

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

不难写。

 

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#define ll long long#define MAXN 1005#define INF 2139062143using 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;}


 

0 0
原创粉丝点击