• 213. 打家劫舍 II


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

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

    示例 1:

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

    示例 2:

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

    示例 3:

    输入:nums = [1,2,3]
    输出:3
    

    提示:

    • 1 <= nums.length <= 100
    • 0 <= nums[i] <= 1000
    1. class Solution {
    2. public:
    3. int rob(vector<int>& nums) {
    4. //环形,分两种考虑,如果加首,那就不带尾;如果加尾,那就不带首
    5. if(nums.size() == 0) return 0;
    6. if(nums.size() == 1) return nums[0];
    7. int res1 = robb(nums,0,nums.size()-2);
    8. int res2 = robb(nums,1,nums.size()-1);
    9. return max(res1,res2);
    10. }
    11. int robb(vector<int>& nums,int start,int end){
    12. //dp[i]:偷i(包括i)之前的,能偷的最大价值为dp[i];
    13. //递推:偷i:dp[i] = dp[i-2] + nums[i];
    14. //不偷i:dp[i] = dp[i-1];
    15. if(start == end) return nums[start];
    16. vector<int>dp(nums.size());
    17. //初始化
    18. dp[start] = nums[start];
    19. dp[start+1] = max(nums[start], nums[start+1]);
    20. for(int i = start+2;i <= end;i++){
    21. dp[i] = max(dp[i-1], dp[i-2] + nums[i]);
    22. }
    23. return dp[end];
    24. }
    25. };

  • 相关阅读:
    【JAVA基础】【查漏补缺】09 - 面向对象进阶(static、继承、多态)
    spark如何配置checkpoint
    1205、mysql视图、mysql存储过程
    近万采集各种典故网站文章大全ACCESS\EXCEL数据库
    CSS_关系选择器
    flutter 图片加载缓存机制深入源码解析
    Python---数据序列类型之间的相互转换
    【Python】 Python 文件与路径处理
    Hbase工作原理
    Leecode33:二叉搜索树的后续遍历序列
  • 原文地址:https://blog.csdn.net/qq_63819197/article/details/134452481