打家劫舍
学习记录自代码随想录
要点:1.递推公式,如果偷第j间房(下标从1开始)则
d
p
[
j
]
=
d
p
[
j
−
2
]
+
n
u
m
s
[
j
−
1
]
dp[j] = dp[j-2] + nums[j-1]
dp[j]=dp[j−2]+nums[j−1],否则
d
p
[
j
]
=
d
p
[
j
−
1
]
dp[j] = dp[j-1]
dp[j]=dp[j−1];
2.此时
d
p
[
0
]
=
0
,
d
p
[
1
]
=
n
u
m
s
[
0
]
dp[0]=0,dp[1] = nums[0]
dp[0]=0,dp[1]=nums[0];
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
if(n == 1) return nums[0];
// 1.dp[j]房屋数量为j时的最多偷窃金额
vector<int> dp(n+1, 0);
// 2.递推公式:dp[j] = max(dp[j-1], dp[j-2]+nums[j-1])
// 3.dp数组初始化
dp[0] = 0;
dp[1] = nums[0];
// 4.遍历顺序:正向遍历
for(int j = 2; j < n+1; j++){
dp[j] = max(dp[j-1], dp[j-2] + nums[j-1]);
}
// 5.举例推导dp数组
return dp[n];
}
};