这题应该是一道简单的DP题目。我的想法是设一个数组dp[],其中dp[i]表示偷到第i家的时候的最大值。那么我们可以推断,dp[i]为
max(dp[0], dp[1],…,dp[i-2])+nums[i] //选第i家
与
max(dp[0], dp[1],…,dp[i-2],dp[i-1]) //不选第i家
之间的最大值。
而dp[0],dp[1],…dp[i-1]必为升序排列,所以dp[i]=max(dp[i-1]+nums[i], dp[i-1])。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int rob(vector<int>& nums) {
if (nums.size()==0) return 0;
vector<int> maxMoney(nums.size(), 0);
maxMoney[0]=nums[0];
maxMoney[1]=max(nums[0], nums[1]);
for (int i=2; i<nums.size(); ++i)
maxMoney[i]=max(maxMoney[i-1], maxMoney[i-2]+nums[i]);
return maxMoney[nums.size()-1];
}
int main()
{
vector<int> nums={2,3,2,6,7,3,1,8};
cout<<rob(nums)<<endl;
return 0;
}