uva 10739 String to Palindrome

题意:给你n个字符串。有三种操作:1,添加任何字符到任何位置。2,删除任何字符。3,替换任何字符。问你经过最少多少次操作,能把给出的字符串变成一个回文串。
定义dp(x,y)为把字符串从x到y变成回文串经过的最少的操作。
则如果str[x]==str[y],那么状态转移成dp(x+1,y-1);
如果str[x]!=str[y],那么就要考虑那三种操作,添加,删除的结果都是一样的,即状态转移成1+min(dp(x+1,y),dp(x,y-1))。替换转移成1+dp(x+1,y-1)。所以str[x]!=str[j]的转移方程就是1+min(dp(i+1,j-1),min(dp(i+1,j),dp(i,j-1))


#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=1005;
int map[N][N];
bool vis[N][N];
char str[N];
int dp(int,int);
int main()
{
    int t,t_cnt=0;
    scanf("%d",&t);
    getchar();
    while(t--)
    {
        memset(vis,0,sizeof(vis));
        memset(map,0,sizeof(map));
        gets(str);
        int len=strlen(str);
        printf("Case %d: %d\n",++t_cnt,dp(0,len-1));
    }
    return 0;
}
int dp(int x,int y)
{
    //printf("%d %d\n",x,y);
    bool &flag=vis[x][y];
    int &res=map[x][y];
    if(flag) return res;
    else if(x>=y){flag=1;res=0;return 0;}
    else
    {
        if(str[x]==str[y]) res=dp(x+1,y-1);
        else res=1+min(dp(x+1,y),min(dp(x,y-1),dp(x+1,y-1)));
        flag=1;return res;
    }
}


你可能感兴趣的:(uva 10739 String to Palindrome)