你是一个专业的小偷, 计划偷窃沿街的房屋, 每间房内都藏有一定的现金. 这个地方所有的房屋都围成一圈, 这意味着第一个房屋和最后一个房屋是紧挨着的. 同时, 相邻的房屋装有相互连通的防盗系统, 如果两间相邻的房屋在同一晚上被小偷闯入, 系统会自动报警.
给定一个代表每个房屋存放金额的非负整数数组, 计算你在不触动警报装置的情况下, 能够偷窃到的最高金额.
示例 1:
输入: [2,3,2]
输出: 3
解释: 你不能先偷窃 1 号房屋 (金额 = 2), 然后偷窃 3 号房屋 (金额 = 2), 因为他们是相邻的.
示例 2:
输入: [1,2,3,1]
输出: 4
解释: 你可以先偷窃 1 号房屋 (金额 = 1), 然后偷窃 3 号房屋 (金额 = 3).
偷窃到的最高金额 = 1 + 3 = 4 .
- class Solution {
- public:
- int rob(vector<int>& nums) {
- if(nums.size()==0) return 0;
- if(nums.size()==1) return nums[0];
- vector<int> dpX(nums.size(),0),dpY(nums.size(),0);// 拆成两个 单列的数组
- dpX[0]=nums[0];// 抢第一个, 则不能抢最后一个
- dpX[1]=max(nums[0],nums[1]);
- dpY[0]=0;// 不抢第一个
- dpY[1]=nums[1];
- for(int i=2;i<nums.size()-1;i++){
- dpX[i]=max(dpX[i-2]+nums[i],dpX[i-1]);
- }
- for(int i=2;i<nums.size();i++){
- dpY[i]=max(dpY[i-2]+nums[i],dpY[i-1]);
- }
- return max(dpX[nums.size()-2],dpY[nums.size()-1]);
- }
- };
- View Code
来源: http://www.bubuko.com/infodetail-3461492.html