1. 程式人生 > >TZOJ 1072: 編輯距離(動態規劃)

TZOJ 1072: 編輯距離(動態規劃)

1072: 編輯距離 分享至QQ空間 去愛問答提問或回答

時間限制(普通/Java):1000MS/10000MS     記憶體限制:65536KByte
總提交: 917            測試通過:275

描述

假設字串的基本操作僅為:刪除一個字元、插入一個字元和將一個字元修改成另一個字元這三種操作。
我們把進行了一次上述三種操作的任意一種操作稱為進行了一步字元基本操作。
下面我們定義兩個字串的編輯距離:對於兩個字串a和b,通過上述的基本操作,我們可以把a變成b或b變成a,那麼字串a變成字串b需要的最少基本字元操作步數稱為字串a和字串b的編輯距離。
例如:a="ABC",b="CBCD",則a與b的編輯距離為2。
你的任務就是:編一個快速的程式來計算任意兩個字串的編輯距離。

輸入

輸入包含多組測試資料。每組測試資料一行,為字串A和字串B。
字串的長度不大於1024,且全為字母。

輸出

編輯距離。

樣例輸入

ABC CBCD

樣例輸出

2

提示

我相信動態規劃演算法能解決這題,因為我就是這樣做的。^_^

題目來源

ZJGSU

#include<stdio.h>
#include<string.h>
int dp[1029][1029];
int main()
{

    char str1[1029],str2[1029];
    while(scanf("%s%s",str1,str2)>0)
    {
        int len1,len2;
        len1=strlen(str1);
        len2=strlen(str2);
        for(int i=0;i<=len2;i++)//注意初始化
        dp[0][i]=i;
        for(int i=0;i<=len1;i++)
        dp[i][0]=i;
        for(int i=1;i<=len1;i++)
        for(int j=1;j<=len2;j++)
        if(str1[i-1]==str2[j-1])
        {
            dp[i][j]=dp[i-1][j-1];
        }
        else
        {
            dp[i][j]=dp[i-1][j]+1;//冊除字元str1[i]
            if(dp[i][j-1]+1<dp[i][j])dp[i][j]=dp[i][j-1]+1;//新增字元str2[j]到str1
            if(dp[i-1][j-1]+1<dp[i][j])dp[i][j]=dp[i-1][j-1]+1;//把str1[i]變成str2[j]
        }
        printf("%d\n",dp[len1][len2]);
    }
}