给定一个代表每个房屋存放金额的非负整数数组,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。计算不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。


这里一定要把 dp[n] 的含义考虑清楚。比较好的做法是 dp[n]表示遇到 n 户人家时的最大收益。这样dp[0]和dp[1]都有明确的含义,初始化很方便。注意这样表示时,dp 数组的长度应初始化为 n + 1。

C++13 linesExpandCollapse
class Solution {
public:
    int rob (vector<int>& nums) {
        int n = nums.size();
        // dp[n] 表示遇到 n 户人家时的最大收益
        vector<int> dp(n + 1, 0); 
        dp[1] = nums[0];
        for (int i = 2; i <= n; i++) {
            dp[i] = max(dp[i - 2] + nums[i - 1], dp[i - 1]);
        }
        return dp[n];
    }
};