House Robber
原题链接House Robber
给定一个数组,选取一些元素使得总和最大,选取规则为
- 不能连续取两个元素,即选取的元素之间至少要间隔一个其它元素
每个元素都有选与不选两种可能,使得用动态规划求解,令dp[n]表示nums[0 : n)的选取结果
代码如下
class Solution {
public:
int rob(vector<int>& nums) {
vector<int> dp(nums.size() + 2, 0);
for(int i = 2; i < dp.size(); ++i)
dp[i] = std::max(nums[i - 2] + dp[i - 2], dp[i - 1]);
return dp[nums.size() + 1];
}
};
观察发现实际上dp数组只用到了dp[i-2]和dp[i-1],所以可以优化空间复杂度
class Solution {
public:
int</