1. 程式人生 > >最小編輯距離

最小編輯距離

n-1 當前 color ++i 高效 i++ ring 代碼 urn

當前狀態一定不能從後面的狀態推出

解dp題步驟

1.定義dp數組

2.建立狀態轉移方程

3.確定初始狀態

4.驗證(循環順序)

題目描述

對於兩個字符串A和B,我們需要進行插入、刪除和修改操作將A串變為B串,定義c0,c1,c2分別為三種操作的代價,請設計一個高效算法,求出將A串變為B串所需要的最少代價。

給定兩個字符串AB,及它們的長度和三種操作代價,請返回將A串變為B串所需要的最小代價。保證兩串長度均小於等於300,且三種代價值均小於等於100。

測試樣例:"abc",3,"adc",3,5,3,100 返回:8 我的代碼:
    int findMinCost(string A, int
n, string B, int m, int c0, int c1, int c2) { // write code here int dp[310][310] = {0}; int tmp = 200; for(int i = 0; i <= n; i++) dp[i][0] = i*c1; for(int i = 0; i <= m; i++) dp[0][i] = i*c0; for(int i = 1; i <= n;i++) {
for(int j = 1; j <= m; j++) { tmp = min(dp[i-1][j]+c1,dp[i][j-1]+c0); if(A[i-1] == B[j-1]) dp[i][j] = min(tmp,dp[i-1][j-1]); else dp[i][j] = min(tmp,dp[i-1][j-1]+c2); } }
return dp[n][m]; }

思路:

1.定義dp數組:dp[i][j],字符串A的前i個字符轉換為B的前j個字符的代價。

2.建立狀態轉移方程

字符串A轉換到字符串B,分三種情況:

A的前n-1位轉換得到字符串B,這時只需要將A的最後一位刪掉即可 dp[i-1][j]+c1

A轉換成字符串B的前m-1位,這時只需要添加B的最後一位即可  dp[i][j-1]+c0

A的前n-1位轉換到字符串B的前m-1位,這時只需要將A的最後一位修改成B的的最後一位即可。dp[i-1][j-1]+c2

dp[i][j] = min( dp[i-1][j]+c1,min(dp[i][j-1]+c0,dp[i-1][j-1]+c2));

3.確定初始狀態

當i為0時,轉換成B則需要添加,到第j位則添加j位,代價為j * c0

當j為0時,轉換成B則需要刪除,到第j位則刪除j位,代價為i * c1

4.驗證

當第i位和第j位相同的時候則不需要修改,d[i][j] = d[i-1][j-1]

註意判斷條件,字符串下標從0開始。

看到別人的代碼,對於dp數組申請了空間,這是一個好習慣,因為堆空間比棧空間大

代碼為:

//申請
int **dp = new int*[n+1];
for(int i=0; i<n+1; ++i){
 dp[i] = new int[m+1];
}
//釋放:
for(int i=0; i<n+1; ++i) delete []dp[i];
        delete []dp;

最小編輯距離