解题思路
1、暴力搜索、回溯法:
1. 抢劫当前的房间,递归回溯与其相差一个的房间抢劫方法
2. 不抢劫当前的房间,递归回溯当前房间的旁边的房间的抢劫方法
2、动态规划:当前房间有抢和不抢两种选择
因此有递推关系式
D
P
(
n
)
=
m
a
x
{
D
P
[
n
−
1
]
D
P
[
n
−
2
]
+
n
u
m
s
[
n
]
DP(n)=max\left\{\begin{aligned}\\DP[n-1]\\DP[n-2]+nums[n]\end{aligned}\right.
DP(n)=max{DP[n−1]DP[n−2]+nums[n]
解题代码
class Solution {
public int rob(int[] nums) { //思路一(LeetCode超时)
return dpRob(nums,nums.length);
}
public int dpRob(int[] nums,int n)
{
if(n == 0)
return 0;
if(n == 1)
return nums[0];
else{
int A = nums[n-1] + dpRob(nums,n-2);
int B = dpRob(nums,n-1);
return Math.max(A,B);
}
}
}
class Solution { //思路二
public int rob(int[] nums) {
if(nums.length == 0) //特殊情况一
return 0;
if(nums.length == 1) //特殊情况二
return nums[0];
int[] dp = new int[nums.length]; //dp数组
dp[0] = nums[0];
dp[1] = Math.max(nums[0],nums[1]);
for(int i = 2; i < nums.length; i++)
{
dp[i] = Math.max(dp[i-1],nums[i] + dp[i-2]); //状态转移方程
}
return dp[nums.length-1];
}
}
总结
一道简单的DP问题