zoukankan      html  css  js  c++  java
  • 打家劫舍||

    题目链接:https://leetcode-cn.com/problems/house-robber-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 = [0]
    输出:0

    提示:
    1 <= nums.length <= 100
    0 <= nums[i] <= 1000

    题解:
    与打家劫舍不同的是,当前所有的房屋都围成一圈。头元素与尾元素紧邻,为了处理这种情况,将数组分两组(第一组:包含头元素,不含尾元数;第二组:不含头元素,含尾元素),分别求得最大值后再比较大小得出最后答案。

    class Solution {
    public:
        int rob(vector<int>& nums) {
            if(nums.size() == 0)    return 0;
            if(nums.size() == 1)    return nums[0];
            int ans1 = robRang(nums, 0, nums.size() - 2);
            int ans2 = robRang(nums, 1, nums.size() - 1);
            return max(ans1, ans2);
        }
    
        int robRang(vector<int> nums, int start, int end)
        {
            //dp[i] : 前i个房屋可以偷窃的最大值为dp[i]
            vector<int> dp(nums.size(), 0);
            if(end == start) return nums[start];
            dp[start] = nums[start];
            dp[start + 1] = max(nums[start], nums[start + 1]);
            for(int i = start + 2; i <= end; i++)
            {
                dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
            }
            return dp[end];
        }
    };
    
    
  • 相关阅读:
    防火墙透明模式
    HP管理工具System Management Homepage安装配置
    kbmmw 中JSON 中使用SQL 查询
    kbmmw 中JSON 操作入门
    第一个kbmmw for Linux 服务器
    kbmmw 5.02发布
    kbmmw 5.01 发布
    使用delphi 10.2 开发linux 上的Daemon
    使用unidac 在linux 上无驱动直接访问MS SQL SERVER
    使用delphi 10.2 开发linux 上的webservice
  • 原文地址:https://www.cnblogs.com/ZigHello/p/15184289.html
Copyright © 2011-2022 走看看