當前狀態一定不能從後面的狀態推出
解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, int n, string b, int m, int c0, int c1, intc2) ;
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++)
}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; i1; ++i)
//釋放:
for(int i=0; i1; ++i) delete
dp[i];
delete dp;
最小編輯距離
題目描述給定兩個字串str1和str2,再給定三個整數ic,dc和rc,分別代表插入 刪除和替換乙個字元的代價,請輸出將str1編輯成str2的最小代價。輸入 abc adc 5,3,2 輸出 2 輸入 abc adc 5,3,100 輸出 8 分析使用動態規劃進行解題,dp i j 表示str1的...
最小編輯距離
dp i j 代表字串word1 0.i 1 與word2 0.j 1 的最小編輯距離。插入舉例 x ex vs y exp 前面的兩個ex都是相同,則編輯距離不變為0,x沒有第三個字元,這裡如果我們插入了乙個字元即可。dp i j dp i j 1 1 刪除舉例 x exp vs y ex 我故意...
NLP 最小編輯距離
最小編輯距離 編輯距離 edit distance 又稱 levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的編輯操作次數。最小編輯距離,是指所需最小的編輯操作次數。動態規劃的核心思想是 將待求解的問題分解為若干個子問題 階段 按順序求解子階段,前一子問題的解,為後一子問題的求解提供...