题目概述:

题解
class Solution {
public:
int rob(vector<int>& nums)
{
int size = nums.size();
if (size == 1)
{
return nums[0];
}
if (size == 2)
{
return max(nums[0], nums[1]);
}
/*
定义dp[i]考虑为下标为0~i的房子 能获得的最大金额
显然dp[0] = nums[0]
dp[1] = max(nums[0], nums[1])
当i >= 2时
对于房子i 有两个选择
1.打劫当前房子,则不能打劫前一个房子
只能获得当前房子的nums[i]和只考虑到
下标为0~i-2的房子能获得的最大金额
dp[i] = nums[i] + dp[i - 2]
2.不打劫当前房子,获得考虑0~i-2的房子能获得的最大金额
dp[i] = dp[i - 1]
综上 dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
可以利用滚动数组优化空间复杂度至O(1)
*/
int a = nums[2], b = max(nums[0], nums[1]), c = nums[0];
/*a dp[i] b dp[i - 1] c dp[i - 2]*/
for (int i = 2; i < size; ++i)
{
a = max(b, c + nums[i]);
c = b;
b = a;
}
return a;
}
};
本文详细解析了一个经典的动态规划问题——打家劫舍。通过定义状态转移方程,使用滚动数组优化空间复杂度,实现了高效求解。适用于理解动态规划思想及优化技巧。
611

被折叠的 条评论
为什么被折叠?



