文章目录
- 一、题目描述
- 二、参考代码
一、题目描述
一个专业的小偷,计划偷窃一个环形街道上沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组 nums ,请计算 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。
链接: LCR 090. 打家劫舍 II
二、参考代码
class Solution {
public:int rob(vector<int>& nums) {int len = nums.size();if(len == 1){return nums[0];}else if(len == 2){return max(nums[0],nums[1]);}else if(len == 3){return max(max(nums[0],nums[1]),max(nums[1],nums[2]));}else{vector<int>v1(nums.begin(),nums.end());vector<int>v2(nums.begin(),nums.end());vector<int>v3(nums.begin(),nums.end());int dp1[300];int dp2[300];int dp3[300];//没有首尾v1.erase(v1.begin());v1.pop_back();int len1 = v1.size();dp1[0] = v1[0];dp1[1] = max(v1[0],v1[1]);for(int i=2;i<len1;i++){dp1[i] = max(dp1[i-2]+v1[i],dp1[i-1]);}int out1 = dp1[len1 - 1];//只考虑首位v2.pop_back();int len2 = v2.size();dp2[0] = v2[0];dp2[1] = max(v2[0],v2[1]);for(int i=2;i<len2;i++){dp2[i] = max(dp2[i-2]+v2[i],dp2[i-1]);}int out2 = dp2[len2 - 1];//只考虑尾位v3.erase(v3.begin());int len3 = v3.size();dp3[0] = v3[0];dp3[1] = max(v3[0],v3[1]);for(int i=2;i<len3;i++){dp3[i] = max(dp3[i-2]+v3[i],dp3[i-1]);}int out3 = dp3[len3 - 1];return max(max(out1,out2),out3);}}
};