算法練習(33):Minimum ASCII Delete Sum for Two Strings

題意:給出兩個字符串,通過刪除字符來使兩個字符串相同,刪除一個字符的耗費是這個字符的ASCII值,找出最小的耗費

分析與思路:這道題也是一道動態規劃題目,可以說是edit distance這道題的簡化版,edit distance的操作有移動,增加刪除字符操作,這裏只有刪除操作,所以思路還是差不多的.

狀態轉移方程爲:dp[i][j]=max{dp[i][j-1]+s2[j],dp[i-1][j]+s1[i],dp[i-1][j-1]+temp}     (temp=s1[i]==s2[j]?0:s1[i]+s2[j])

具體可以參考http://blog.csdn.net/kingsonying/article/details/78755208。

代碼:

class Solution {
public:
	int minimumDeleteSum(string s1, string s2) {
		vector<vector<int>> dp(s1.length()+1, vector<int>(s2.length() + 1, 0));
		dp[0][0] = 0;
		for (int i = 1; i < s1.length() + 1; i++) {
			dp[i][0] = s1[i-1]+dp[i-1][0];
		}
		for (int i = 1; i < s2.length()+1; i++) {
			dp[0][i] = s2[i - 1] + dp[0][i - 1];
		}
		for (int i = 1; i < s1.length() + 1; i++) {
			for (int j = 1; j < s2.length() + 1; j++) {
				int temp = 0;
				if (s1[i - 1] != s2[j - 1]) {
					temp = s1[i - 1] + s2[j - 1];
				}
				dp[i][j] = dp[i - 1][j] + s1[i - 1];
				if (dp[i][j - 1] + s2[j - 1] < dp[i][j]) dp[i][j] = dp[i][j - 1] + s2[j - 1];
				if (dp[i - 1][j - 1] + temp < dp[i][j]) dp[i][j] = dp[i - 1][j - 1] + temp;
			}
		}
		return dp[s1.length()][s2.length()];
	}
};


發佈了80 篇原創文章 · 獲贊 72 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章