POJ3356 – AGTC(区间DP&&编辑距离)

题目大意

给定字符串X和Y,可以对字符串进行一下三种操作:

1、删除一个字符

2、插入一个字符

3、替换一个字符

每个操作代价是1,问运用以上三种操作把X变为Y所需的最小步数是多少?

题解

定义dp[i][j]为把X的前i个字符转换为Y的前j个字符所需的最小步数

如果X[i]==Y[j]则dp[i][j]=dp[i-1][j-1]

如果X[i]!=Y[j]则dp[i][j]=min(dp[i-1][j-1]+1,dp[i-1][j]+1,dp[i][j-1]+1)

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 1005
char x[MAXN],y[MAXN];
int dp[MAXN][MAXN];
int main()
{
    int n,m;
    while(~scanf("%d%s",&n,x+1))
    {
        memset(dp,0,sizeof(dp));
        scanf("%d%s",&m,y+1);
        dp[0][0]=0;
        for(int i=1; i<=n; i++)
            dp[i][0]=i;
        for(int j=1; j<=m; j++)
            dp[0][j]=j;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)
                if(x[i]==y[j])
                    dp[i][j]=dp[i-1][j-1];
                else
                {
                    dp[i][j]=min(dp[i-1][j],dp[i][j-1])+1;
                    dp[i][j]=min(dp[i][j],dp[i-1][j-1]+1);
                }
        printf("%d\n",dp[n][m]);
    }
    return 0;
}

posted on 2013-08-13 21:02  仗剑奔走天涯  阅读(236)  评论(0编辑  收藏  举报

导航