记忆化搜索dp(uva10739)

来源:互联网 发布:什么牌网络机顶盒好 编辑:程序博客网 时间:2024/05/16 07:35

题意:给定一个字符串,可以进行添加、删除、替换字符使其成为回文串,问最少的操作次数是多少

思路:记忆话搜索,dp[i][j]表示区间(i,j)变成回文串所需要的最少次数

如果str[i]==str[j],则dp[i][j]=dp[i+1][j-1],否则dp[i][j]=min{dp[i][j-1](在i端插入),dp[i+1][j](在j端插入),dp[i+1][j-1](替换)}

插入和删除操作时一样的

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<vector>#include<cmath>#include<queue>#include<stack>#include<map>#include<set>#include<algorithm>using namespace std;const int maxn=1010;int N;char s[maxn];int dp[maxn][maxn];int DP(int l,int r){    if(dp[l][r]!=-1)return dp[l][r];    if(l>=r)return 0;    int ans=0;    if(s[l]==s[r])ans=DP(l+1,r-1);    else        ans=min(min(DP(l,r-1),DP(l+1,r)),DP(l+1,r-1))+1;    return dp[l][r]=ans;}int main(){    int T,cas=1;    scanf("%d",&T);    while(T--)    {        scanf("%s",s);        memset(dp,-1,sizeof(dp));        int len=strlen(s);        printf("Case %d: %d\n",cas++,DP(0,len-1));    }    return 0;}


0 0