1.
我们设一个dp[i]表示前i个房间的能偷的最大价值。
很明显dp[1]=num[0], 其后,对每个房间我们可以选择偷或者不偷。在不偷的情况下直接就是dp[i-1],在偷的时候就是dp[i-2]+num[i-1]
代码如下所示:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int rob(vector<int>& nums) {
// write code here
int size=nums.size();
vector<int> dp(size+1, 0);
dp[1]=nums[0];
for(int i=2;i<=size;++i){
dp[i]=max(dp[i-1], nums[i-1]+dp[i-2]);
}
return dp[size];
}
};
2.
比起上边那个其实就是这里是个环而不是一个单纯的数列了。
但是两端只有两种可能:
如果我们偷第一个房间,我们就不偷最后一个房间,表现出来就是最后一个数不进行状态转移,直接取前一个的值
如果我们不偷第一个房间,直接遍历数组转移一遍即可
最后比较两个值谁大就用哪个
代码如下所示:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int rob(vector<int>& nums) {
// write code here
vector<int> dp(nums.size()+1, 0);
dp[1]=nums[0];
for(int i=2;i<nums.size();++i){
dp[i]=max(dp[i-1], dp[i-2]+nums[i-1]);
}
int res=dp[nums.size()-1];
dp.clear();
dp[1]=0;
for(int i=2;i<=nums.size();++i){
dp[i]=max(dp[i-1], dp[i-2]+nums[i-1]);
}
res=max(res, dp[nums.size()]);
return res;
}
};