【演算法】動態規劃-優化編輯器問題
原文:https://blog.csdn.net/shizheng163/article/details/50988023
對於兩個字串A和B,我們需要進行插入、刪除和修改操作將A串變為B串。 定義ic,dc,rc分別為三種操作的代價,請設計一個高效演算法,求出將A串變為B串所需要的最少代價。 給定兩個字串A和B,及它們的長度和三種操作代價,請返回將A串變為B串所需要的最小代價。保證兩串長度均小於等於300.
生成大小為(N+1)*(M+1)的矩陣dp. dp[x][y]表示A前x個字串編輯成 B前y個字元所花費的代價. 對於第一行來說,dp[0][y]表示將一個空串變為B的前y個字元組成的子串,花費的代價為ic*y; 同理,對於第一列dp[x][0] = x*dc; 對於其他的位置,dp[x][y]可能有以下幾種取值: dp[x-1][y-1]+rc;//A[x-1]!=B[y-1] 將前x-1個字元變為B前y-1個字元,再將最後一個字元替換. dp[x-1][y-1];//A[x-1]==B[y-1] 將前x-1個字元變為B前y-1個字元,最後一個不用修改. dp[x-1][y]+dc;//刪除一個字元,將前x-1個字元變為B的前y個字元 dp[x][y-1]+ic;//將A前x-1個字元變為B的前y個字元,再插入一個字元 dp[x][y]的值就為以上四者最小的一個. 求解完畢,dp[n][m]即為所求.
class MinCost {
public:
int findMinCost(string A, int n, string B, int m, int ic, int dc, int rc)
{
vector< vector<int> > dp(n+1, vector<int>(m+1, 0) );
for (int i=1; i<=m; ++i)
dp[0][i] = ic*i;
for (int i=1; i<=n; ++i)
dp[i][0] = dc*i;
for (int i=1; i<=n; ++i)
{
for (int j=1; j<=m; ++j)
{
int case1 = dp[i-1][j]+dc;
int case2 = dp[i][j-1]+ic,case3 = dp[i-1][j-1];
if(A[i-1] != B[j-1])
case3 += rc;
dp[i][j] = min(min(case1, case2), case3);
}
}
return dp[n][m];
}
};
相關文章
- 演算法:編輯距離問題(動態規劃,詳細解答)演算法動態規劃
- 動態規劃-編輯距離動態規劃
- 斜率優化動態規劃優化動態規劃
- 最小總和問題(動態規劃演算法)動態規劃演算法
- “插花問題”的動態規劃法演算法動態規劃演算法
- 插花問題的“動態規劃法”演算法動態規劃演算法
- 動態規劃8:最優編輯str1-->str2動態規劃
- 演算法——動態規劃演算法求解字串的編輯距離演算法動態規劃字串
- Leetcode 編輯距離(動態規劃)LeetCode動態規劃
- 01揹包問題理解動態規劃演算法動態規劃演算法
- 動態規劃之子序列問題動態規劃
- 揹包問題----動態規劃動態規劃
- 【動態規劃】揹包問題動態規劃
- 整數劃分問題(動態規劃)動態規劃
- 運籌優化(七)--動態規劃解析優化動態規劃
- 動態規劃 01揹包問題動態規劃
- 找零問題與動態規劃動態規劃
- 【動態規劃】01揹包問題動態規劃
- 動態規劃-01揹包問題動態規劃
- 動態規劃,股票問題留坑動態規劃
- 動態規劃篇——揹包問題動態規劃
- 醜數問題——動態規劃、Java動態規劃Java
- (動態規劃)最小分糖果問題動態規劃
- 動態規劃--01揹包問題動態規劃
- 動態規劃9:變態跳臺問題動態規劃
- 動態規劃演算法動態規劃演算法
- 演算法_動態規劃演算法動態規劃
- 演算法-動態規劃演算法動態規劃
- 01揹包動態規劃空間優化動態規劃優化
- 【動態規劃】01揹包問題【續】動態規劃
- 動態規劃5:找零錢問題動態規劃
- 演算法系列-動態規劃(1):初識動態規劃演算法動態規劃
- 好題——動態規劃動態規劃
- 動態規劃專題動態規劃
- 動態規劃題單動態規劃
- 大廠常考動態規劃演算法題動態規劃演算法
- 前端演算法 - 動態規劃前端演算法動態規劃
- 動態規劃演算法(轉)動態規劃演算法