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;

}

你可能感兴趣的:(poj)