• 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
    ",dp[n][m]);
        }
        return 0;
    }
  • 相关阅读:
    BZOJ 1003 物流运输
    549565
    26566
    68
    554554
    5656
    49886
    5989
    6898
    656
  • 原文地址:https://www.cnblogs.com/zjbztianya/p/3256011.html
Copyright © 2020-2023  润新知