動態規劃8:最優編輯str1-->str2
題目:
對於兩個字串A和B,我們需要進行插入、刪除和修改操作將A串變為B串,定義c0,c1,c2分別為三種操作的代價,求出將A串變為B串所需要的最少代價。給定兩個字串A和B,及它們的長度和三種操作代價,請返回將A串變為B串所需要的最小代價。保證兩串長度均小於等於300,且三種代價值均小於等於100。
樣例:"abc",3,"adc",3,5,3,100返回:8
思路:
將問題拆分成為2個維度的問題(A串作為縱向,B串作為橫向),建立二維陣列來進行解決。在建立二維陣列時要注意是建立n*m的矩陣還是建立(n+1)*(m+1)的矩陣,關鍵是思考對於陣列為””空串的情形是否要作為初始條件,即是否應該讓空串作為初始條件,從實際意義上來理解,空串也是一種字串,且與可能要求將空串編輯成為某個字串,或者將某個字串編輯成為空串,因此需要對字串A,B從空串“”開始進行拆分考慮。但是實際上是否從空串或者0開始分解要看如果分解成為這種初始條件是否可以據此求出後面的所有情況的結果,即所求的第1行,第1列應當是有效的,能夠據此求出後面的一系列情況,而不是固定的記住。
這個題目和找零錢問題類似。
dp[n+1][m+1] 其中dp[i][j]表示s1[0...i-1]轉變成s2[0...j]的代價
插入刪除修改代價分別為 ic dc rc
初始情況:
(1)dp[0][0]表示s1 s2都是空串,所以代價為0
(2)dp[0][j]第一行,表示s1是空串,轉變成s2[j],那麼代價就是插入j個字元的代價dp[0][j]=ic*j
(3)dp[i][0]第一列,表示s2是空串,那麼轉換代價就是刪除s1中的i個字元代價 dp[i][0]=dc*i;
遞迴:
d[i][j]來自以下四種情況:最小值
(1)s1[0...i-1]能夠轉換成s2[0...j],此時代價為轉換代價+刪除一個字元的代價。即d[i][j]=d[i-1][j]+dc
(2)s1[0...i]能夠轉換成s2[0...j-1],此時代價為轉換代價+插入一個字元的代價。即d[i][j]=d[i][j-1]+ic
(3)當s1[i]!=s[j]時,d[i][j]=d[i-1][j-1]+rc
(4)當s1[i]==s[j]時,d[i][j]=d[i-1][j-1]
public class MinCost {
public int findMinCost(String s1, int n, String s2, int m, int c0, int c1, int c2) {//插入刪除修改依次為c0 c1 c2
// write code here
if(s1==null&&s2==null) return 0;
int[][] dp=new int[n+1][m+1];
//初始條件
dp[0][0]=0;//表示兩個空串的轉換
for(int i=1;i<=m;i++){//空串轉換成s2=插入i個字元的代價
dp[0][i]=i*c0;
}
for(int i=1;i<=n;i++){//字串轉成空串=刪除i個字元的代價
dp[i][0]=i*c1;
}
//遞迴
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
dp[i][j]=Math.min( (dp[i-1][j]+c1), (dp[i][j-1]+c0) );
if(s1.charAt(i-1)==s2.charAt(j-1)){
dp[i][j]=Math.min( dp[i][j], dp[i-1][j-1]);
}else{
dp[i][j]=Math.min(dp[i][j], dp[i-1][j-1]+c2);
}
}
}
return dp[n][m];
}
}
相關文章
- 動態規劃-編輯距離動態規劃
- 【演算法】動態規劃-優化編輯器問題演算法動態規劃優化
- 動態規劃---求硬幣最優解動態規劃
- Leetcode 編輯距離(動態規劃)LeetCode動態規劃
- PHP使用動態規劃實現最優紅包組合PHP動態規劃
- 斜率優化動態規劃優化動態規劃
- 最優二叉查詢樹—動態規劃C++動態規劃C++
- 動態規劃:最長上升子序列動態規劃
- 最長上升子序列動態規劃動態規劃
- 動態規劃求最長降序序列動態規劃
- 動態規劃-最長公共子序列動態規劃
- 動態規劃——最長公共子序列動態規劃
- 【DP專輯】ACM動態規劃總結ACM動態規劃
- 【動態規劃(一)】動態規劃基礎動態規劃
- 動態規劃-最長上升子序列模型動態規劃模型
- 動態規劃(最長公共子序列LCS)動態規劃
- 演算法:編輯距離問題(動態規劃,詳細解答)演算法動態規劃
- 動態規劃動態規劃
- [動態規劃] 六、最長迴文子串動態規劃
- 動態規劃7:最長上升子序列LIS動態規劃
- CSP之壓縮編碼(動態規劃)動態規劃
- 運籌優化(七)--動態規劃解析優化動態規劃
- 怎樣衡量兩個字串的相似度(編輯距離動態規劃求解)字串動態規劃
- 演算法——動態規劃演算法求解字串的編輯距離演算法動態規劃字串
- 動態規劃求解最長上升子序列問題動態規劃
- 最長公共子序列問題—動態規劃sdut動態規劃
- 動態規劃求解最大子段和 (兩種寫法+還原最優解)動態規劃
- 動態規劃分析動態規劃
- 動態規劃(DP)動態規劃
- 動態規劃初步動態規劃
- 模板 - 動態規劃動態規劃
- 動態規劃法動態規劃
- 01揹包動態規劃空間優化動態規劃優化
- 【動態規劃】字串最小編輯距離Java實現動態規劃字串Java
- 動態規劃解最長迴文子序列並優化空間複雜度動態規劃優化複雜度
- 動態規劃經典問題----最長公共子序列動態規劃
- 演算法系列-動態規劃(1):初識動態規劃演算法動態規劃
- 多重揹包動態規劃及空間優化動態規劃優化