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); } };