leetcode 打家劫舍 中等_滚动数组

 

 

dp[i][0] 表示到 i 位置,但是不包括最后一个 i 点的最大值。dp[i][1] 表示到 i 位置,但是包括最后一个 i 点的最大值。

dp[i][0] = max(dp[i - 1][0], dp[i - 1][1])

dp[i][1] = dp[i - 1][0] + nums[i]

没用滚动数组优化的代码:

class Solution {
public:
    int rob(vector<int>& nums) {
        // dp[i].first 表示不包含 i 这个数的最大和
        // dp[i].second 表示包含 i 这个数的最大和
        vector<pair<int, int>> dp(nums.size());
        for(int i = 0; i < nums.size(); ++ i) {
            if(i == 0) {
                dp[i].first = 0;
                dp[i].second = nums[i];
            } else {
                dp[i].first = max(dp[i - 1].first, dp[i - 1].second);
                dp[i].second = dp[i - 1].first + nums[i];
            }
        }
        return max(dp.back().first, dp.back().second);
    }
};