线性规划--状态转移(打家劫舍)

打家劫舍I

1.题目

2.思路

要解决这个问题,我们可以使用动态规划的方法。我们将问题分为两个子问题:偷窃前n-1家或者偷窃前n-2家。如果我们选择偷窃第n家,那么我们就不能偷窃第n-1家,因为它们是相邻的。所以,我们可以得到如下的递推关系:

令dp[i]表示偷窃前i家能够得到的最高金额,则

  • 如果我们不偷窃第i家,那么dp[i] = dp[i-1];
  • 如果我们偷窃第i家,那么dp[i] = dp[i-2] + nums[i],其中nums[i]表示第i家房屋的金额。

最终的答案就是dp[n-1]和dp[n-2]中的较大值,因为我们可以选择偷窃最后一家或者不偷窃最后一家。

3.代码

public class 打家劫舍 {//令dp[i]表示偷窃前i家能够得到的最高金额,则//如果我们不偷窃第i家,那么dp[i]=dp[i-1]//如果我们偷窃第i家,那么dp[i]=dp[i-2]+nums[i],nums[i]表示第i家房屋的金额//最终答案就是dp[n-1],dp[n-2]中的较大值public int rob(int[] nums) {if(nums==null||nums.length==0) {return 0;}if(nums.length==1) {return nums[0];}if(nums.length==2) {return Math.max(nums[0], nums[1]);}int prev2=nums[0];int prev1=Math.max(nums[0], nums[1]);for(int i=2;i<nums.length;i++) {int curr = Math.max(prev1, prev2+nums[i]);prev2=prev1;prev1=curr;}return prev1;}public static void main(String[] args) {打家劫舍 robber = new 打家劫舍();int [] nums= {1,2,3,1};System.out.println(robber.rob(nums));}
}

4.知识

    1)令dp[i]表示偷窃前i家能够得到的最高金额,则
    如果我们不偷窃第i家,那么dp[i]=dp[i-1]
    如果我们偷窃第i家,那么dp[i]=dp[i-2]+nums[i],nums[i]表示第i家房屋的金额
    最终答案就是dp[n-1],dp[n-2]中的较大值

2)代码重点:

        int prev2=nums[0];
        int prev1=Math.max(nums[0], nums[1]);

        for(int i=2;i<nums.length;i++) {
            int curr = Math.max(prev1, prev2+nums[i]);
            prev2=prev1;
            prev1=curr;
        }
        return prev1;

我们使用了两个变量prev2prev1来存储前两个房屋的最大偷窃金额,然后遍历数组中的每个房屋,更新这两个变量的值。最后返回prev1,它代表偷窃前n-1家房屋的最大金额。

3)   if(nums==null||nums.length==0) {
            return 0;
        }

先判断数组的是否为空或者长度为零
        if(nums.length==1) {
            return nums[0];
        }

若数组长度为1,直接返回第一个元素的大小
        if(nums.length==2) {
            return Math.max(nums[0], nums[1]);
        }

若数组长度为2,比较两个元素,返回较大的那个元素的值

打家劫舍II

1.题目

2.思路

与上面的“打家劫舍I”唯一的不同就是:房屋围成一圈。

为了解决这个问题,我们可以将问题分为两个子问题来解决:

  1. 偷窃从第一个房屋到倒数第二个房屋的最大金额(即排除最后一个房屋)。
  2. 偷窃从第二个房屋到最后一个房屋的最大金额(即排除第一个房屋)。

然后,取这两个子问题的解中的较大值作为最终的结果。

3.代码

package 动态规划;  public class 打家劫舍II {  public int rob(int[] nums) {  if (nums == null || nums.length == 0) return 0;  if (nums.length == 1) return nums[0];  if (nums.length == 2) return Math.max(nums[0], nums[1]);  int n = nums.length;  // dp[i][0] 表示偷窃前 i 个房屋(不包括第 i 个房屋)时的最大金额  // dp[i][1] 表示偷窃前 i 个房屋(包括第 i 个房屋)时的最大金额  int[][] dp = new int[n][2];  dp[0][0] = 0;  dp[0][1] = nums[0];  dp[1][0] = nums[0];  dp[1][1] = Math.max(nums[0], nums[1]);  for (int i = 2; i < n - 1; i++) {  // 不偷窃第 i 个房屋时,最大金额是前 i-1 个房屋的最大金额  dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]);  // 偷窃第 i 个房屋时,最大金额是前 i-2 个房屋的最大金额加上第 i 个房屋的金额  dp[i][1] = dp[i - 1][0] + nums[i];  }  // 对于最后一个房屋,我们不能偷窃它,因为房屋是排列成一个圈的  // 所以我们返回偷窃前 n-1 个房屋的最大金额  return Math.max(dp[n - 2][0], dp[n - 2][1]);  }  public static void main(String[] args) {  打家劫舍II solution = new 打家劫舍II();  int[] nums = {2, 3, 2};  System.out.println( solution.rob(nums));  }  
}

4.知识

     1)   int n = nums.length;  
        // dp[i][0] 表示偷窃前 i 个房屋(不包括第 i 个房屋)时的最大金额  
        // dp[i][1] 表示偷窃前 i 个房屋(包括第 i 个房屋)时的最大金额  

        int[][] dp = new int[n][2];  
        dp[0][0] = 0;  
        dp[0][1] = nums[0];  
        dp[1][0] = nums[0];  
        dp[1][1] = Math.max(nums[0], nums[1]);  

既然该题用二维数组的方式解,就不能只写 dp[0][0]和dp[0][1],会出错

2)       for (int i = 2; i < n - 1; i++) {  
            // 不偷窃第 i 个房屋时,最大金额是前 i-1 个房屋的最大金额  
            dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1]);  
            // 偷窃第 i 个房屋时,最大金额是前 i-2 个房屋的最大金额加上第 i 个房屋的金额  
            dp[i][1] = dp[i - 1][0] + nums[i];  
        }  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2804382.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

UnityWebGL 设置全屏

这是Unity导出Web默认打开的页面尺寸 修改后效果 修改 index.html 文件 1.div元素的id属性值为"unity-container"&#xff0c;宽度和高度都设置为100%&#xff0c;意味着该div元素将占据整个父容器的空间。canvas元素的id属性值为"unity-canvas"&#xff…

网卡本质,网络发展(局域网,广域网概念)

目录 引入 网卡的本质 网络的发展 引入 早期 局域网LAN&#xff08;Local Area Network&#xff09; 广域网WAN&#xff08;Wide Area Network&#xff09; 注意 引入 前面我们已经学习了很多关于linux系统的知识,其中文件系统和线程尤为繁杂 而网络其实也算系统的一部…

嵌入式学习-qt-Day4

嵌入式学习-qt-Day4 一、思维导图 二、作业 1.设计一个界面&#xff1a;显示系统时间&#xff1b;可以设置闹钟&#xff0c;在设置的时间到达后&#xff0c;显示五次字符串&#xff0c;并且语音播报。 Wight.h #ifndef WIDGET_H #define WIDGET_H #include <QWidget>…

Day 1.进程的基本概念、相关命令、函数结口

进程基本概念 一、进程&#xff1a; 程序&#xff1a;存放在外存中的一段数据组成的文件 进程&#xff1a;是一个程序动态执行的过程&#xff0c;包括进程的创建、进程的调度、进程的消亡 二、进程相关的命令 1.top 动态查看当前系统中所有的进程信息&#xff08;根据CPU…

Nginx网络服务二-----(虚拟机和location)

一、HTTP设置 1.设置虚拟主机 1.1Nginx 基于域名---虚拟主机 include /apps/nginx/conf.d/*.conf; 1.2Nginx 基于端口---虚拟主机 在做了域名的基础上&#xff0c;按照以下步骤继续 1.3Nginx 基于IP---虚拟主机 2.server下的root root路径格式 指定文件的路径 url …

Visual Paradigm 工具使用思考

大型项目的管理与实施&#xff0c;需要有高效的管理工具&#xff0c;VP算是不错的&#xff0c;美中不足是界面太死板&#xff0c;使用不便利&#xff0c;对于小型项目按照这个模式来&#xff0c;相当麻烦。 当然肯定会有人觉得不错&#xff0c;需要的&#xff0c;联系我

面试经典150题 -- 二叉树 (总结)

总的地址 : 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台 104 . 二叉树的最大深度 104 . 二叉树的最大深度 递归 : 直接用递归访问 &#xff0c; 访问左孩子 和 右孩子 &#xff0c; 如果 存在 &#xff0c; 深度就1 &…

vue-router 三级路由,路由跳转页面异常白屏或404,或刷新三级路由页面后一级和二级路由菜单丢失

问题描述 情况1. vue-router 定义三级路由&#xff0c;路由跳转了&#xff0c;页面404或者白屏情况2. 点击菜单三级路由后&#xff0c;刷新页面后一级和二级路由菜单丢失 解决方案&#xff1a; 某些时候是因为二级和三级的路由共用router-view&#xff0c;可以使用router-vi…

基于springboot+vue的大创管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

【Android 性能优化:内存篇】——ExoPlayer 释放后内存没有恢复问题探索

背景 最近笔者承接项目的内存优化指标&#xff0c;在内存调研的过程中发现项目中视频播放结束后&#xff0c;内存没有恢复到播放前到水平。项目中用的 EXO 版本为2.19.1&#xff0c;并且笔者自己也写了个简单的 Demo&#xff0c;发现也是如此。虽然有一些偏门方法可以优化&…

阶段四python编程第四章循环

一级目录循环的基本使用 循环的作用&#xff1a;让指定的代码重复执行 while循环最常用的应用场景就是让执行的代码按照指定的次数重复执行 while基本语法&#xff1a; 如果要输出的是100个hello world,该怎么做&#xff1f; 死循环&#xff1a; 程序应该避免出现死循环 whi…

nginx 具体介绍

一&#xff0c;nginx 介绍 &#xff08;一&#xff09;nginx 与apache 1&#xff0c; Apache event 模型 相对于 prefork 模式 可以同时处理更多的请求 相对于 worker 模式 解决了keepalive场景下&#xff0c;长期被占用的线程的资源浪费问题 因为有监听线程&#…

stm32——hal库学习笔记(IIC)

一、IIC总线协议介绍&#xff08;掌握&#xff09; 二、AT24C02介绍&#xff08;了解&#xff09; 三、AT24C02读写时序&#xff08;掌握&#xff09; 四、AT24C02驱动步骤&#xff08;掌握&#xff09; 五、编程实战&#xff08;掌握&#xff09; myiic.c #include "./B…

C++ 基础算法 双指针 数组元素的目标和

给定两个升序排序的有序数组 A 和 B &#xff0c;以及一个目标值 x 。 数组下标从 0 开始。 请你求出满足 A[i]B[j]x 的数对 (i,j) 。 数据保证有唯一解。 输入格式 第一行包含三个整数 n,m,x &#xff0c;分别表示 A 的长度&#xff0c;B 的长度以及目标值 x 。 第二行包…

在UE5中制作UI环形进度条

在日常开发中&#xff0c;经常会有环形进度条UI的效果&#xff0c;例如技能CD时间、加载动画等&#xff0c;本文将通过材质球节点实现该效果&#xff0c;相较于准备美术素材&#xff0c;这样的做法更为方便&#xff0c;效果如下&#xff1a; 1.制作环状效果材质函数 在内容面…

Vue3 + Ts (使用lodash)

安装 npm i --save lodash使用 import _ from lodash⚠️报警告&#xff1a;&#xff01;&#xff01;&#xff01; 此时还需要安装ts声明文件库 npm install types/lodash -D安装之后重启Vscode还是会提示上面的警告&#xff0c;此时还需在tsconfig.ts里面配置 {"c…

Leetcode 209.长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输入&…

城市白模:裸眼3D下的未来都市构想

随着科技的飞速发展&#xff0c;城市规划与建设已经迈入了一个全新的时代。在这个时代里&#xff0c;“城市白模”成为了设计师、建筑师、城市规划者乃至普通市民的热门话题。那么&#xff0c;什么是“城市白模”&#xff1f;它又如何改变我们对城市的认知与期待呢&#xff1f;…

后端程序员入门react笔记(四)-综合运用,写一个小demo

样式模块化 有时候我们会遇到这样的问题&#xff0c;有两个css对一个class声明了样式&#xff0c;这样的话后引入的css会覆盖前面的css样式&#xff0c;导致样式冲突&#xff0c;那么我们怎么解决这种问题呢&#xff0c;我们可以使用样式的模块化&#xff0c;我们起名一个inde…

百度百科词条在网络推广中的六大作用

也许很多网友都发现了&#xff0c;在网上查资料&#xff0c;百科词条往往是优先展示的。一方面因为百科是搜索引擎自身的平台&#xff0c;另一方面就是因为百科信息权威&#xff0c;网友认可度高。所以企业开展网络营销&#xff0c;百科营销是一块重要阵地。 也有的企业认为百科…