文章目录
1. 题目
2. 思路
(1) 动态规划
- 利用一个二维数组存储每个房屋没被偷和被偷两种状态下获得的最高金额。
- 初始条件是第一家没被偷时的最高金额是0,被偷时的最高金额是nums[0]。
- 从第二家开始,若没被偷,则最高金额是前一家没被偷和被偷中金额较大的一个;若被偷,则根据题目条件,前一家必定是没被偷,因此最高金额是前一家没被偷的最高金额加上这一家的金额。
(2) 动态规划优化
-
通过记录前两家获得的最高金额代替二维数组。
-
第一家获得的最高金额显然是nums[0],第二家获得的最高金额是从前两家挑金额较高的一家偷,此后,每一家获得的最高金额要么是没偷前一家的,则最高金额是前前一家的金额加上这一家的金额,要么是偷前一家的,则这一家不能偷,最高金额是前一家的金额。
3. 代码
public class Test {
public static void main(String[] args) {
}
}
class Solution {
public int rob(int[] nums) {
int[][] dp = new int[nums.length][2];
dp[0][0] = 0;
dp[0][1] = nums[0];
for (int i = 1; i < nums.length; i++) {
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]);
dp[i][1] = dp[i - 1][0] + nums[i];
}
return Math.max(dp[nums.length - 1][0], dp[nums.length - 1][1]);
}
}
class Solution1 {
public int rob(int[] nums) {
if (nums.length == 1) {
return nums[0];
}
int pre1 = nums[0];
int pre2 = Math.max(nums[0], nums[1]);
int cur = pre2;
for (int i = 2; i < nums.length; i++) {
cur = Math.max(pre1 + nums[i], pre2);
pre1 = pre2;
pre2 = cur;
}
return cur;
}
}