首页 > 其他分享 >【DP】LeetCode 213. 打家劫舍 II

【DP】LeetCode 213. 打家劫舍 II

时间:2023-04-25 16:01:13浏览次数:44  
标签:nums int 最大值 II DP 数组 打家劫舍 LeetCode dp

题目链接

213. 打家劫舍 II

思路

分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律

在数组的动态规划问题中,一般 dp[i] 都是表示以 nums 以前 i 个元素组成(即 nums[i - 1])的状态;dp[i][j] 分别表示以 nums1 前 i 个元素(即 nums1[i - 1])组成和以 nums2 前 j 个元素(即 nums2[j - 1])组成的状态,以此类推

字符串也是个数组,是字符数组

表示状态

状态表示就是靠猜,但是会有猜的套路,一般都是通过最终结果和数组数量来猜

这个题和【DP】LeetCode 198. 打家劫舍十分相似,唯一的区别就是在首尾房子的选择上,这时候可以分为三种情况讨论:

  1. 打劫第一间房
  2. 打劫最后一间房
  3. 首尾两间都不打劫

如下图所示

image

图片来自labuladong

实际上第三种情况肯定是小于等于前面两种情况的,因为它的可选择性最少,不可能得出最大值,所以只需要判断前面两种情况取最大值即可。

定义 \(dp[i][j]\) 表示在情况 i 的状况下,前 j 个房间能打劫到的最大值。

找状态转移方程

思考的方向是:大问题的最优解怎么由小问题的最优解得到

与198题相似

\[dp[i][j]=\max (dp[i][j-1], dp[i][j-2]+nums[j-1]) \]

边界处理

这一部分是本题最需要注意的点,因为两个遍历的起始点不同,所以初值设置也要单独考虑

dp[0][1] = nums[0];
dp[1][2] = nums[1];

代码

dp数组版

class Solution {
    public int rob(int[] nums) {
        int n = nums.length;
        if(n == 1){
            return nums[0];
        }

        // dp[0] 求 nums[0 : n - 2] 的最大值
        // dp[1] 求 nums[1 ; n - 1] 的最大值
        int[][] dp = new int[2][n + 1];

        dp[0][1] = nums[0];
        dp[1][2] = nums[1];
        for(int i = 2; i < n; i++){
            dp[0][i] = Math.max(dp[0][i - 1], dp[0][i - 2] + nums[i - 1]);
        }
        for(int i = 3; i <= n; i++){
            dp[1][i] = Math.max(dp[1][i - 1], dp[1][i - 2] + nums[i - 1]);
        }

        return Math.max(dp[0][n - 1], dp[1][n]);
    }
}

标签:nums,int,最大值,II,DP,数组,打家劫舍,LeetCode,dp
From: https://www.cnblogs.com/shixuanliu/p/17352875.html

相关文章

  • Java代码虾皮item_search-根据关键词获取商品列表 API 接口(title商品标题、pic_url宝
     Shopee是东南亚最大的电商平台之一。Shopee拥有商品种类,包括电子消费品、家居、美容保健、母婴、服饰及健身器材等。做好shopee店铺需要注意以下几点:1.选择优质的产品2.每日上新产品3.营销策略4.引流策略5.发货的地点Java代码操作示例importjava.io.BufferedReader;impo......
  • 本地图文直接复制到WordPress编辑器中
    ​ 在之前在工作中遇到在富文本编辑器中粘贴图片不能展示的问题,于是各种网上扒拉,终于找到解决方案,在这里感谢一下知乎中众大神以及TheViper。通过知乎提供的思路找到粘贴的原理,通过TheViper找到粘贴图片的方法。其原理为一下步骤:监听粘贴事件;【用于插入图片】获取光标位置;【......
  • leetcode 570 至少有5名直接下屬的經理
    至少有5名直接下屬的經理 子查詢select`name`fromEmployeewhereidin(selectmanagerIdfromEmployeegroupbymanagerIdhavingcount(managerId)>=5) 自連接selecte2.namefromEmployeee1,Employeee2wheree1.managerId=e2.idgr......
  • [LeetCode] 1342. Number of Steps to Reduce a Number to Zero 将数字变成 0 的操作
    Givenaninteger num,return thenumberofstepstoreduceittozero.Inonestep,ifthecurrentnumberiseven,youhavetodivideitby 2,otherwise,youhavetosubtract 1 fromit.Example1:Input:num=14Output:6Explanation: Step1)14ise......
  • LeetCode 131.分割回文串
    1.题目:给你一个字符串s,请你将s分割成一些子串,使每个子串都是回文串。返回s所有可能的分割方案。回文串是正着读和反着读都一样的字符串。示例1:输入:s="aab"输出:[["a","a","b"],["aa","b"]]示例2:输入:s="a"输出:[["a"]]来源:力扣(LeetCode)链接:https......
  • 黑客利用WordPress 插件暗中建立后门网站
    东方联盟网络安全组织在上周发布的一份报告中透露,有人观察到威胁行为者利用一个合法但过时的WordPress插件暗中建立后门网站,作为正在进行的活动的一部分。有问题的插件是EvalPHP,由名为flashpixx的开发人员发布。它允许用户插入PHP代码页和WordPress网站的帖子,每次在网......
  • 剑指 Offer 55 - II. 平衡二叉树
    剑指Offer55-II.平衡二叉树输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。示例1:给定二叉树[3,9,20,null,null,15,7]3/\920/\157返回true。示例2:......
  • modprobe和insmod的区别
    在Linux中,modprobe和insmod都可以用来加载module,不过现在一般都推荐使用modprobe而不是insmod了。modprobe和insmod的区别是什么呢?1.modprobe可以解决loadmodule时的依赖关系,比如loadmoudleA就必须先loadmouduleB之类的,它是通过/lib/modules/<kernel-version>/modules.dep文......
  • DDP运行报错(单卡无错):ERROR:torch.distributed.elastic.multiprocessing.api:failed (e
    使用DDP时出现错误,但是单卡跑无错误。错误记录如下:RuntimeError:Expectedtohavefinishedreductionintheprioriterationbeforestartinganewone.Thiserrorindicatesthatyourmodulehasparametersthatwerenotusedinproducingloss.Youcanenableunu......
  • 【DP】LeetCode 198. 打家劫舍
    题目链接198.打家劫舍思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以前i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素(即nums......