題意:給出一個數組,相鄰兩個數至少選一個,求選出的數的和最小值。
分析與思路:一個個數字的選,很容易然我想起用動態規劃的方法來做,首先想到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];
}
};