(线性dp)LeetCode. 打家劫舍
(线性dp)LeetCode198.打家劫舍1
思路
主要问题是这一家到底抢不抢,有两种状态,那么就可以设置一个二维\(dp\)数组
\(dp[i][0/1]\)前\(i\)家第\(i\)家抢(不抢)能够获得的最大值
-
如果抢的话: \(dp[i][1] = dp[i - 1][0] + nums[i]\)
-
如果不抢的话:\(dp[i][0] = max(dp[i - 1][0], dp[i - 1][1])\)
代码
int ans[110][3] = {0};
int rob(vector<int>& nums)
{
int len = nums.size();
ans[0][1] = nums[0];
for (int i = 1; i < len; i++)
{
ans[i][0] = max(ans[i - 1][0], ans[i - 1][1]);
ans[i][1] = ans[i - 1][0] + nums[i];
}
return max(ans[len - 1][0], ans[len - 1][1]);
}
(线性dp) LeetCode213. 打家劫舍2
思路
多出来两种情况,第一个选不选,分别讨论就好了
代码
int rob(vector<int>& nums)
{
int len = nums.size();
if (len == 1) return nums[0];
if (len == 2) return max(nums[0], nums[1]);
// 第一个不选时;
int dp1[110][2] = {0};
int dp2[110][2] = {0};
dp1[1][1] = nums[1];
for (int i = 2; i < len; i++)
{
dp1[i][0] = max(dp1[i - 1][0], dp1[i - 1][1]);
dp1[i][1] = dp1[i - 1][0] + nums[i];
}
int ans1 = max(dp1[len - 1][1], dp1[len - 1][0]);
// 第一个选的时候
dp2[0][1] = nums[0];
for (int i = 1; i < len - 1; i++)
{
dp2[i][0] = max(dp2[i - 1][0], dp2[i - 1][1]);
dp2[i][1] = dp2[i - 1][0] + nums[i];
}
int ans2 = max(dp2[len - 2][1], dp2[len - 2][0]);
return max(ans1, ans2);
}

浙公网安备 33010602011771号