【演算法】動態規劃-優化編輯器問題

HelloZEX發表於2018-08-04

原文: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];
    }
};

 

相關文章