最小編輯距離
阿新 • • 發佈:2018-05-10
n-1 當前 color ++i 高效 i++ ring 代碼 urn
當前狀態一定不能從後面的狀態推出
解dp題步驟
1.定義dp數組
2.建立狀態轉移方程
3.確定初始狀態
4.驗證(循環順序)
題目描述
對於兩個字符串A和B,我們需要進行插入、刪除和修改操作將A串變為B串,定義c0,c1,c2分別為三種操作的代價,請設計一個高效算法,求出將A串變為B串所需要的最少代價。
給定兩個字符串A和B,及它們的長度和三種操作代價,請返回將A串變為B串所需要的最小代價。保證兩串長度均小於等於300,且三種代價值均小於等於100。
測試樣例:"abc",3,"adc",3,5,3,100 返回:8 我的代碼:int findMinCost(string A, intn, 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;
最小編輯距離