一个简单的动态规划问题---小偷案例

Java算法训练—小偷案例

文章目录

    • Java算法训练---小偷案例
  • 前言
  • 一、案例描述
  • 二、问题分析
  • 三、代码示例
  • 总结


前言

动态规划是一种算法技巧,先举一个例子:
  如何让一个四岁的小孩理解动态规划的思路?国外友人有这样一个例子:列出一个1+1+1+1+1+1+1+1=?的式子,让小孩回答,小孩思索数秒后会告诉你答案是8。随后在前面再多写一个+1,再提问答案是多少,小孩会瞬间告诉你是9,问小孩为什么这么快就能得到答案,他会告诉你,因为只需要再加一个1就可以了。
  这里面就包含了动态规划的思想:将待求解的问题分成若干个子问题,从子问题的求解得到原问题的解,而在这个过程中,已经求解过的子问题,其解是已经被记录下的,这样就能避免很多重复的计算。下面我们看一个具体的简单案例。

一、案例描述

ps:此题来源于力扣网站

  一个小偷准备挨家挨户进行偷窃,每一家都有一些能偷到的金额值,但是不能连续进入相邻的两间房屋,否则会被发现。将这个设定抽象成一个数组,每家拥有的金额组成一个非负的整型数组,在不被发现的情况下,计算小偷能偷到的最大数额。

例如[1,2,5,3,4,8,2],那么最大值就是:第一家(1)+第三家(5)+第六家(8)=14.

二、问题分析

先来分析一些特殊情况:
①.假如只有一间房屋,那么小偷只能偷窃该房间,那么最大值就是该房间里的金额值。
②.假如有两间房屋,那么两间房屋里,哪间房屋的金额值高,其值就是小偷能偷到的最大值。

那么,当房间数量大于2时,由于小偷不能进入相邻的房间:
①.假如小偷进入了第x间房,则他必然没有进入x-1间房,最高金额sum就等于前面x-2间房中的最大总金额值加上第x间房里的金额值。
②.假如小偷没有进入第x间房,那么最高金额sum就等于前面x-1间房里的最高总金额。

  于是,x任取的情况下,小偷进入第x间房屋和没有进入第x间房屋这两种情景就涵盖了这个案例的题解。
  即最高金额总值,就是这两种情况中的更大的那个值。用 sum[i] 来表示前 i 间房屋里能偷到的最大金额值,用cash [i]来表示第 i 间房里的金额,根据上面的分析可以得到下面的关系式(状态转移方程):

sum[i] = max(sum[i-2]+cash[i] , sum[i-1])

再把前面分析的特殊情况作为边界条件考虑进去:

①. sum[0] = cash[0] ---------------------------房间数为1时
②. sum[1] = max(cash[0] ,cash [1]) ------ 房间数为2时

这样,假设有n间房屋,那么最后总值数组中的最大值就是 sum[n-1] .

三、代码示例

将上述的思路转化为代码如下:

public static int rob(int[] cash) {//数组为0,表示房间数为0,那么最高金额自然也是0if (cash.length == 0 || cash == null) {return 0;}//一间房屋的情况,该房间内的金额就是最大值,直接返回该值if (cash.length == 1) {return cash[0];}//创建一个用于存储最大总和值的数组 sumint len = cash.length;int[] sum = new int[len];//给定sum的边界条件,房间数为1和2时sum[0] = cash[0];sum[1] = Math.max(cash[0], cash[1]);//从房间数为3开始,最大总值数组的每一个元素值应该满足以下的状态转移方程for (int i = 2; i < len; i++) {sum[i] = Math.max(sum[i - 2] + cash[i], sum[i - 1]);}//遍历完数组,也就找到了最大值.return sum[sum.length - 1];}

测试上述方法,比如就将我们前面列举的数组[1,2,5,3,4,8,2]代入方法里。

public static void main(String[] args) {int[] cash = {1,2,5,3,4,8,2};int x = rob(cash);System.out.println("小偷能偷到的最大金额为:"+x);}

运行结果如下:
在这里插入图片描述

总结

  这就是一个简单的案例,解题方法体现了动态规划的思想。动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。这时候将问题分成很多子问题,并且求出子问题的解,用一个容器(本例中的数组)来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果记录在容器中,避免重复计算,这就是动态规划法的基本思路。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python编程判断谁是小偷

谁是小偷 ‎小区发生盗窃案&#xff0c;有四个人嫌疑最大&#xff0c;警察找来讯问。‌ ‎A说&#xff1a;不是我。‌ ‎B说&#xff1a;是C。‌ ‎C说&#xff1a;是D。‌ ‎D说&#xff1a;他冤枉人。‌ ‎四人中有一人说了假话&#xff0c;编程分析谁是小偷。 此题主要…

焦耳小偷工作原理分析

当开关闭合&#xff0c;Q1获得基极电流导通&#xff0c;右侧线圈流过电流&#xff0c;由于同名端的关系其在左侧线圈产生的互感电动势上负下正&#xff0c;正反馈使得Q1迅速饱和导通。右侧电流处于饱和状态&#xff0c;感应电动势消失&#xff0c;互感电动势也消失。互感电动势…

c语言四个人中有一个人是小偷,、甲,乙,丙,丁四个人中有一个人是小偷,请根据四个人的谈话判断谁是小偷?已知四个人中有一个人说假话...

、甲,乙,丙,丁四个人中有一个人是小偷,请根据四个人的谈话判断谁是小偷?已知四个人中有一个人说假话 关注:65 答案:5 mip版 解决时间 2021-01-31 07:52 提问者酒瘾渼亽兒 2021-01-30 16:58 、甲,乙,丙,丁四个人中有一个人是小偷,请根据四个人的谈话判断谁是小偷?已…

推理题-谁是小偷?

警察抓住了A、B、C、D四名盗窃嫌疑犯&#xff0c;其中只有一人是小偷。在审问时&#xff0c; A说&#xff1a;“我不是小偷”&#xff1b; B说&#xff1a;“C是小偷”&#xff1b; C说&#xff1a;“小偷肯定是D”&#xff1b; D说&#xff1a;“C在冤枉好人”。 现在已经…

饥荒联机版专用服务器怎么修改小偷包,饥荒联机小偷背包代码 | 手游网游页游攻略大全...

发布时间&#xff1a;2016-08-14 饥荒海难小偷背包获得方法?饥荒失落之船刷小偷背包图文教程,饥荒海难里的小偷背包是格子最多的背包了,相信很多玩家都想拥有,但是小偷背包却不是那么好拿的,今天小编就为大家带来一套饥荒海难刷小偷背包图文教程,希望对大家有所帮助 ... 标签&…

【Multisim仿真】焦耳小偷电路仿真实验

【Multisim仿真】焦耳小偷电路仿真实验 Multisim仿真 本实验仿真平台&#xff1a;Multisim14 基本电路 仿真前的相关设置选项 变压器参数设置主副线圈绕组比例调整比例&#xff1a;10:10 铁芯设置选项&#xff1a; ###对变压器输出绕组端的电压进行瞬态电压进行捕捉 设置…

深度优先遍历算法-01小偷偷东西问题

小偷偷东西问题 前言 深度优先遍历是经典的图论算法&#xff0c;深度优先遍历算法的搜索逻辑和它的名字一样&#xff0c;只要有可能&#xff0c;就尽量深入搜索&#xff0c;直到找到答案&#xff0c;或者尝试了所有可能后确定没有解。简单来说&#xff0c;深度优先遍历就是按照…

百家云在人工智能领域再有新动作,发布应用于多个行业的AIGC解决方案

4月17日消息&#xff0c;音视频SaaS上市公司百家云&#xff08;股票代码&#xff1a;RTC&#xff09;今日宣布&#xff0c;公司将正式推出应用于多个垂直行业及场景的人工智能生成内容及视频解决方案。 百家云总裁马义表示&#xff0c;此次发布的解决方案&#xff0c;将在极短…

可以远程连接服务器,但是无法ping通问题

右键电脑&#xff0c;找到管理 在服务器管理里找到配置项 在配置项里找到 高级安全windows防火墙 在高级安全windows防火墙里&#xff0c;找到&#xff0c;按如下图示&#xff0c;找到“文件和打印机共享&#xff08;回显请求-ICMPv4-in&#xff09;双击。此时图片状态默…

解决连接vcenter (客户端无法向服务器发送完整的请求。(基础连接已经关闭:发送时发生错误。)) 问题...

vCenter版本 5.5 vCenter 安装在server 2008 r2上面&#xff0c;今天补丁一打&#xff0c;重启后就无法连接vcenter了&#xff0c;起初以为是补丁的问题导致vcenter工作不正常&#xff0c;卸载了补丁依旧无法正常连接。 报未知连接错误&#xff0c;&#xff08;客户端无法向服务…

微信提示已连接到服务器失败,微信提示无法连接到服务器如何解决

近来发现不少网友对于微信提示无法连接到服务器如何解决这方面的讯息关注的热度颇高的&#xff0c;那么小编今天就针对此微信提示无法连接到服务器如何解决收集了一些相关的讯息 希望小编收集的这些讯息 能帮助到你。 1、更换接入点,重新连接网络&#xff1a; 2、单击手机上的M…

新手安装postgreSQL后无法连接服务器

2019独角兽企业重金招聘Python工程师标准>>> 系统&#xff1a;Linux Deepin 15.1 postgreSQL&#xff1a;9.5.1 pgAdmin Ⅲ&#xff1a;1.22.0 使用新立得安装postgreSQL和pgAdminⅢ之后&#xff0c;打开pgAdmin需新建服务器。 打开新建服务器窗口后&#xff0c;名称…

用云服务器架设好服务器显示无法连接

各位论坛的前辈大家好&#xff0c;我是刚进入这个圈子的小白&#xff0c;曾经这个问题困扰我两天时间&#xff0c;找了好多教程&#xff0c;都不是我想要的&#xff0c;我一度以为是我传奇版本的问题&#xff0c;所以后面解决掉之后&#xff0c;出个帖子给大家分享下&#xff1…

使用telnet命令,报错:无法打开主机的连接在端口23连接失败

1.页面载入出错时&#xff0c;查找问题的方法 当访问某个页面时&#xff0c;出现如下情况&#xff1a; 遇到以上情况&#xff0c;可以先通过以下的方式确认网络是否连接上 &#xff08;1&#xff09;打开cmd&#xff0c;输入命令&#xff1a;ping <ip> &#xff08;2&…

标题: 连接到服务器------------------------------无法连接到 (local)。------------------------------其他信息:在与

标题: 连接到服务器------------------------------无法连接到 (local)。------------------------------其他信息:在与 在使用SQL Server的时候无法连接的错误&#xff0c;可以参照下图 我这个问题的解决方法就是将服务器名称改一下&#xff0c;删掉原来的服务器名称栏的东西…

手机总显示连接不到聊天服务器,连接不到聊天服务器

连接不到聊天服务器 内容精选 换一换 访问CloudTable的HBase连接不上&#xff0c;出现如下所示的错误信息&#xff1a;出现该问题的可能原因为&#xff1a;网络访问不通。由于CloudTable的链接地址是内网地址&#xff0c;不是公网地址&#xff0c;不能在公网环境直接连接CloudT…

[SQL Server无法连接到服务器]标题: 连接到服务器 --------- 无法连接到 ****

标题: 连接到服务器 ---------- 无法连接到 **** 现象&#xff1a; 电脑安装好SQL可以用&#xff0c;之后&#xff08;过了几天&#xff0c;或者不久&#xff09;就出现如题错误&#xff0c;无法连接。因为此问题笔者也已重装过多次该软件…… 原因&#xff1a; 每次SQL Serve…

计算机科学研究课题申报书,教育科学研究课题立项申请书范文

教育科学研究课题立项申请书范文 分类&#xff1a;课题研究 发表时间&#xff1a;2020-04-17 16:23 教育科学研究课题立项申请书范文 教育科学研究课题立项申请书&#xff0c;都有规定的表格的&#xff0c;你需要向哪个课题管理部门递交&#xff0c;就需要向谁索要&#xff0c;…

SCI论文修稿时间延长信的申请格式-论文投稿经验总结-第4期

一、背景 如果SCI论文给定的修改周期太短&#xff0c;如何写信给期刊编辑部申请延长论文修改时间呢&#xff1f;如果不想麻烦导师&#xff0c;能否用学生(第一作者)自己的邮箱去联系编辑部呢&#xff1f;这篇博文&#xff0c;将给出答案。 二、论文修稿时间延长信格式及其回复…

【审稿意见回复和修改稿上传-流程】

审稿意见回复和修改稿上传流程 准备材料&#xff1a; Response-letter.pdfRevised-manuscript.pdfRevised-manuscript 的.tex及全部生成pdf的辅助文件 哪种页面可以上传修改稿&#xff1f; 提示&#xff1a;一般只有Submitting author的账号才可以上传&#xff0c;也有的一作…