力扣刷题——198. 打家劫舍

198. 打家劫舍

这也是一道简单的动态规划题目

class Solution {
    public int rob(int[] nums) {
        
        int[] ans = new int[nums.length+1];
        ans[0]=0;
        ans[1]=nums[0];
        for(int i = 1; i < nums.length; i++){
            ans[i+1] = Math.max(ans[i], nums[i] + ans[i-1]);
        }
        
        
        return ans[nums.length];
    }
}

如果考虑空间优化

public int rob(int[] nums) {
    int prev = 0;
    int curr = 0;

    // 每次循环,计算“偷到当前房子为止的最大金额”
    for (int i : nums) {
        // 循环开始时,curr 表示 dp[k-1],prev 表示 dp[k-2]
        // dp[k] = max{ dp[k-1], dp[k-2] + i }
        int temp = Math.max(curr, prev + i);
        prev = curr;
        curr = temp;
        // 循环结束时,curr 表示 dp[k],prev 表示 dp[k-1]
    }

    return curr;
}

动态规划
一篇很好的讲解

动态规划的的四个解题步骤是:

  • 定义子问题

  • 写出子问题的递推关系

  • 确定 DP 数组的计算顺序

    动态规划有两种计算顺序,一种是自顶向下的、使用备忘录的递归方法,一种是自底向上的、使用 dp 数组的循环方法。不过在普通的动态规划题目中,99% 的情况我们都不需要用到备忘录方法,所以我们最好坚持用自底向上的 dp 数组

  • 空间优化(可选)

posted on 2023-02-20 13:22  pumpkinsBig  阅读(22)  评论(0)    收藏  举报

导航