首页 > 其他分享 >【博学谷学习记录】超强总结,用心分享 | 动态规划经典例题总结二

【博学谷学习记录】超强总结,用心分享 | 动态规划经典例题总结二

时间:2022-12-22 10:14:27浏览次数:30  
标签:总结 return nums int max 房屋 超强 例题 dp

打家劫舍Ⅰ

题目

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

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

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 400

解题思路

一、定义数组元素的含义

那我们就定义一维数组dp[i] 的含义为:前 i+1 间房子能偷到的最大的金额。那么,dp[nums.length-1]就是我们要的答案了。

二、找出关系数组元素间的关系式

我们从子问题中来找数组元素之间的关系。

假设有房子 x1,x2,x3,可以看出我们只能选择(x2)或者(x1,x3),因此前三间房子能偷到的最大金额为dp[2]=max((x2),(x1+x3))。以此类推dp[3]=max(d[2],(dp[1]+x4))......

所以关系式为:

dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i]);
三、找出初始值

可以看出,该关系式需要从 i=2 开始,否则数组索引会超出范围。因此我们需要定义dp[0],dp[1]的初始值。

另外还需要考虑nums数组的元素个数,

  • 如果nums数组为空,return 0;
  • 如果nums数组只有一个元素,return nums[0];
dp[0]=nums[0];
dp[1]=Math.max(nums[0],0+nums[1]);

代码

private static int rob(int[] nums){
    int n = nums.length;
    //判断数组nums的情况
    if (nums == null){
        return 0;
    } else if (n==1) {
        return nums[0];
    }
    //dp[i] 代表该下标i位置上 所能偷盗的最大金额
    int[] dp = new int[n]; 

	//定义初始值
    dp[0]=nums[0];
    dp[1]=Math.max(nums[0],0+nums[1]);
    
    // dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i])
    for (int i = 2; i < n; i++) {
        dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i]);
    }

    return dp[n-1];
}

打家劫舍Ⅱ

题目

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

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

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 1000

解题思路

这道题和上一道的区别就在于房屋首位是相连的,偷了第一间就不能偷最后一间房屋。

两种情况:

  • 如果偷窃了第一间房屋,则不能偷窃最后一间房屋,因此偷窃房屋的范围是第一间房屋到最后第二间房屋;
  • 如果偷窃了最后一间房屋,则不能偷窃第一间房屋,因此偷窃房屋的范围是第二间房屋到最后一间房屋

代码

private static int rob(int[] nums){
    int n = nums.length;
    //判断数组nums的情况
    if (nums.length == 0){
        return 0;
    } else if (n==1) {
        return nums[0];
    }else if (n==2){
        return Math.max(nums[0],nums[1] );
    }

    return Math.max(robRange(nums,0,n-2),robRange(nums,1,n-1));
}
static int robRange(int[] nums,int start,int end ){
    
	//dp[i] 代表该下标i位置上 所能偷盗的最大金额
    int n = end-start+1;
    int[] dp = new int[n];
    
    //定义初始值
    dp[0]=nums[start];
    dp[1]=Math.max(nums[start],nums[start+1]);

    for (int i = start+2; i <= end ; i++) {
        if (start==0){
            dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i]);
        }else{
            int j=i-1;
            dp[j] = Math.max(dp[j-1],dp[j-2]+nums[i]);
        }
    }

    return dp[n-1];
}

代码优化:

private static int rob(int[] nums){
    int n = nums.length;
    //判断数组nums的情况
    if (nums.length == 0){
        return 0;
    } else if (n==1) {
        return nums[0];
    }else if (n==2){
        return Math.max(nums[0],nums[1] );
    }

    return Math.max(robRangePlus(nums,0,n-2),robRangePlus(nums,1,n-1));
}

private static int robRangePlus(int[] nums,int start,int end ){
    int a = nums[start];
    int b = Math.max(nums[start], nums[start + 1]);
    for (int i = start + 2; i <= end; i++) {
        int temp = b;
        b = Math.max(a + nums[i], b);
        a = temp;
    }
    return b;
}

标签:总结,return,nums,int,max,房屋,超强,例题,dp
From: https://www.cnblogs.com/Azureblue/p/16997733.html

相关文章

  • 【博学谷学习记录】超强总结,用心分享 | 动态规划经典例题总结一
    不同路径Ⅰ题目一个机器人位于一个mxn网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中......
  • 工作5年的老程序员的年终总结
    看了上篇的博客是2020年9月10号,已经两年多没写博客了,重新执笔开始写篇年终总结!时间飞逝,已经毕业5年多,这一路经历太多了,这篇博客对整个经历进行复盘和总结。......
  • 冲刺总结(七)
    冲刺总结(七)一、登录注册这里注册用户lcy1211,密码设置为123456来到数据库,我们可以看到刚刚注册的用户lcy1211,和通过密态储存的口令123456二、加解密本项目在kali......
  • 12月21日内容总结——forms组件渲染标签、展示信息、校验数据的一些补充,forms组件参数
    目录一、forms组件渲染标签二、forms组件展示信息三、forms组件校验补充四、forms组件参数补充五、forms组件源码剖析六、modelform组件什么是modelform组件?使用校验性组件......
  • Pandas中高效的选择和替换操作总结
    使用正确的工具和技术来最大限度地利用数据是很重要的。Pandas是数据操作、分析和可视化的重要工具,有效地使用Pandas可能具有挑战性,从使用向量化操作到利用内置函数,这些最佳......
  • Express框架总结
    express框架总结Express安装通过express提供的脚手架直接创建一个应用安装脚手架:npminstall-gexpress-generator创建项目:expressexpress-demo安装依赖:npmi......
  • TI工程师总结的判断ADS129x是否工作正常的方法步骤
    当大多数ADC出现无响应时,可以通过一些基本的调试技术帮助验证器件是否仍然正常工作。以下是ADS129x器件出现无响应时需要采取的一些基本步骤:为器件通电。然后探测器......
  • 2022年总结
    转眼,2022年就剩下十多天了。 倒是应了那句老话:“人生天地之间,若白驹过隙,忽然而已。” 不管你是否准备好,2022年倒计时的钟表已经敲响,最后十天,请记得好好地谢谢自己!......
  • “互帮互助”小程序开发总结
    这次小程序开发的经历让我学到了很多,下面我就将一一总结我从中学到的知识1.我学会了规范的编程。以前的我不懂编程规范,编出来的代码既不写注释,阅读性又很差,而且变量名大部......
  • 标准 C++ 中的 string 类的用法总结
     相信使用过MFC编程的朋友对CString这个类的印象应该非常深刻吧?的确,MFC中的CString类使用起来真的非常的方便好用。但是如果离开了MFC框架,还有没有这样使用起来......