LeetCode每日一题,213. 打家劫舍II
先看题目描述
算法和思路
动态规划
状态方程定义:设偷窃房屋的下标范围是 [start,end],用 dp[i] 表示在下标范围 [start,i] 内可以偷窃到的最高总金额
状态转移方程:dp[i] = max{dp[i - 2] + nums[i], dp[i - 1]}
边界条件:dp[start] = nums[start],dp[start + 1] = max{nums[start], nums[start + 1]}
分别取 (start,end) = (0,n - 2) 和 (start,end) = (1,n - 1) 进行计算,取两个 dp[end] 中的最大值,即可得到最终结果
由于 dp[i] 只与 dp[i - 1] 和 dp[i - 2] 有关,因此可以使用滚动数组优化
算法源码
动态规划
1 | class Solution { |
下面是自己一开始实现的代码,也是使用了动态规划,但是使用的状态方程不太一样,dp[i][0] 表示在 (0,i) 范围内不偷下标为 i 的房子情况下可盗窃的最大金额,dp[i][1] 表示在 (0,i) 范围内偷下标为 i 的房子情况下可盗窃的最大金额
状态转移方程为:dp[i][0] = max{dp[i - 1][1],dp[i - 1][0]},dp[i][1] = dp[i - 1][0] + nums[i]
然后分第一个房子偷不偷的两种情况进行考虑
1 | class Solution { |