• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
Niro Einteson
文可提笔安天下 武可上马定乾坤
博客园    首页    新随笔    联系   管理    订阅  订阅

213. 打家劫舍 II

213. 打家劫舍 II

 

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

示例 1:

输入: [2,3,2]
输出: 3
解释: 你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。
示例 2:

输入: [1,2,3,1]
输出: 4
解释: 你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。
  偷窃到的最高金额 = 1 + 3 = 4 。

 

 1 class Solution {
 2 public:
 3     int rob(vector<int>& nums) {
 4         if(nums.size()==0) return 0;
 5         if(nums.size()==1) return nums[0];
 6         vector<int> dpX(nums.size(),0),dpY(nums.size(),0);//拆成两个 单列的数组
 7         dpX[0]=nums[0];//抢第一个,则不能抢最后一个
 8         dpX[1]=max(nums[0],nums[1]);
 9         dpY[0]=0;//不抢第一个
10         dpY[1]=nums[1];
11         for(int i=2;i<nums.size()-1;i++){
12             dpX[i]=max(dpX[i-2]+nums[i],dpX[i-1]);
13         }
14        for(int i=2;i<nums.size();i++){
15             dpY[i]=max(dpY[i-2]+nums[i],dpY[i-1]);
16        }
17        return max(dpX[nums.size()-2],dpY[nums.size()-1]);
18     }
19 };
View Code

 

posted @ 2020-03-14 18:35  Nirogo  阅读(172)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3