描述
你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家,就不能再偷第二家;如果偷了第二家,那么就不能偷第一家和第三家。
给定一个整数数组nums,数组中的元素表示每个房间存有的现金数额,请你计算在不被发现的前提下最多的偷窃金额。
数据范围:数组长度满足 1≤n≤2×1051 \le n \le 2\times 10^51≤n≤2×105 ,数组中每个值满足 1≤num[i]≤50001 \le num[i] \le 50001≤num[i]≤5000
示例1
输入:[1,2,3,4]
返回值:6
说明:最优方案是偷第 2,4 个房间
示例2
输入:[1,3,6]
返回值:7
说明:最优方案是偷第 1,3个房间
示例3
输入:[2,10,5]
返回值:10
说明:最优方案是偷第 2 个房间
代码
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int rob(vector<int>& nums) {
// write code here
if(nums.size()==0)
return 0;
vector<int> dp(nums.size()+1,0);
for(int i=1;i<=nums.size();i++){
if(i==1)
dp[i]=nums[i-1];
else{
if(dp[i-1]>dp[i-2]+nums[i-1])
dp[i]=dp[i-1];
else
dp[i]=dp[i-2]+nums[i-1];
}
}
return dp[nums.size()];
}
};