力扣刷题——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) 收藏 举报
浙公网安备 33010602011771号