一:题目
二:上码
class Solution {
public:
/**
思路:
1.分析题意
首先判断动态规划;能够满足答案的结果有多种;但是我们需要的是最值
那么类似0/1背包
物品是我们不同房间的价值
这个背包容量是我们房间个数
2.动态规划5步走
1>:确定dp数组的含义以及下标的含义
dp[j]表示的是偷到第j间房间的时候最大价值为dp[j]
2>:确定dp数组的状态递推公式
我们需要偷到某个房间的时候一定要比起一个房间的价值大
如果我们要偷第j间房间的时候,我们dp[j] = dp[j-2] + nums[j]
但是有可能我们偷了第j间房间的时候也没有上一间房间的价值大;
这里需要理解是上一间房间也是距离其偷的上一间房间也是间隔一个房间的,这里我们之所以
要考虑dp[j-1] 是因为其是不同的偷取顺序
dp[j] = max(dp[j-2]+nums[j],dp[j-1])
3>:确定dp数组的初始化
当j=2的时候我们是需要dp[0]和dp[1]的;
dp[0] = nums[0];
dp[1] = max(nums[0],nums[1]);因为我们dp[j]数组定义就是到第j间房间的最大价值
第一间房和第二间房我们不能同时偷取,所以我们要选取最大值
4>:确定搭配数组的遍历顺序
正序
5>:举例验证
0 1 2 3 4//从下标0开始的话也就是第一间房间
2 7 11 11 12
2 1 1 2
2 2 3 4
*/
int rob(vector<int>& nums) {
vector<int> dp(nums.size(),0);
if(nums.size() == 0) return 0;
if(nums.size() == 1) return nums[0];
dp[0] = nums[0];
dp[1] = max(nums[0],nums[1]);
for(int j = 2; j < nums.size(); j++) {
dp[j] = max(dp[j-1],dp[j-2]+nums[j]);//关于偷不偷j家 这是两条不同的偷取路径
}
return dp[nums.size()-1];
}
};
虽然还穿着袄 但是我已经开始期待夏天了 想想去年夏天心疼那1000块钱的游泳培训班钱 就没去学游泳 今年夏天想去海边游泳的计划又得推迟了 花钱记住一条铁律 只要是投资自己得钱 就一定要花 否则以后肯定就会后悔得 比如说现在不会游泳