算法練習(31):最小和

題意:給出一個數組,相鄰兩個數至少選一個,求選出的數的和最小值。

分析與思路:一個個數字的選,很容易然我想起用動態規劃的方法來做,首先想到dp[i]代表考慮前i個數字時的最小和,但是又不能考慮到第i個數是否已經選,因爲這涉及到我i+1時能否選的問題,第i個數如果不選,則i+1就必須選,第i個選了,則i+1可選可不選。所以狀態轉移方程爲:dp[i][0]=dp[i-1][1];dp[i][1]=min{dp[i-1][0]+A[i],dp[i-1][1]+A[i]};

代碼:

class Solution {
public:
	int minSum(vector<int>& A) {
		vector<vector<int>> dp(A.size(),vector<int>(2,9999));
		dp[0][0] = 0;
		dp[0][1] = A[0];
		for (int i = 1; i < A.size(); i++) {
			dp[i][1] = dp[i - 1][1] + A[i];
			if (dp[i - 1][0] + A[i] < dp[i][1]) dp[i][1] = dp[i - 1][0] + A[i];
			dp[i][0] = dp[i - 1][1];
		}
		if (dp[A.size() - 1][0] > dp[A.size()-1][1]) return dp[A.size() - 1][1];
		else return dp[A.size() - 1][0];
	}
};


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