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);}

运行结果如下:

总结

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

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

  1. 【(SQL+HTML+PHP)综合】一个简单论坛网站的综合开发案例(具有用户注册、登录、注销、修改信息、留言等功能)

    目录 1 实验环境 2 网站页面功能规划 2.1 论坛首页 2.2 个人中心 2.3 实现留言功能 2.4 数据库及连接数据库 3 实验阶段一:实现注册.登录.注销和更新头像等功能 3.1 数据库 3 ...

  2. 一个简单的freemark输入输出的案例(一)

    假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...

  3. 用一个简单的创建游戏角色方案来理解类继承的运用以及浅淡protected权限修饰符的作用。

    最近不知道怎得懒了许多,就是不想写总结. 想了想还是在这里说下protected的权限关系吧,怕大家在后面找不到 首先我们可能在学c++中都会听到老师说protected权限是介于public和pri ...

  4. 简单的会计实际业务案例

    制造企业常用会计实务 本篇博客用一个简单的制造企业会计实务来加深对会计基础知识的理解. 甲公司系中国注册的有限公司,于2019年9月1日开始营业.现记录甲公司2019年9月的业务,并根据业务记录凭证, ...

  5. 使用SpringBoot一小时快速搭建一个简单后台管理(增删改查)(超详细教程)

    最近也是临近期末了,各种的期末大作业,后台管理也是很多地方需要用到的,为了方便大家能快速上手,快速搭建一个简单的后台管理,我花了两天时间整理了一下 我会从0开始介绍,从数据库的设计到前端页面的引入最后 ...

  6. 一个简单案例教你如何用Typescript写Vuex

    案例源代码: github.com/danielhuoo/- 前言 相信很多人都像我一样,学习使用了vuex后,想把项目改写成Typescript.但是官方教程要么晦涩难懂,要么缺少鲜活的例子.我花了 ...

  7. BaseAdapter的一个简单案例

    BaseAdapter的一个简单案例 主Activity import android.os.Bundle; import android.app.Activity; import android.v ...

  8. android商品数量加减,微信小程序实现一个简单的商品数量加减案例

    简介 这是一个用微信小程序原生代码实现的数量加减demo,主要是用于商品购物车或者商品详情修改数量使用,很简单哦~~~. 核心js方法说明addCount(增加数量) delCount (减少数量) ...

  9. 【vue2.0进阶】案例:用Vuex实现一个简单的计算器

    昨天我们学习了Veux的几个重要的核心概念.当然只讲概念还不够,必须要结合上案例才能理解得更深刻. 马上就开始我们今天的案例:用Vuex实现一个简单的网页计算器. 我们之前的章节说过,Vuex适合在较 ...

最新文章

  1. python在线课程-开始网上在线深度学习python课程
  2. java set 包含_关于Java的Set的集合是否包括问题,如下为什么不包括?
  3. 图文并茂,傻瓜都能看懂的 JVM 内存布局
  4. Universal-imageLoader缓存图片加载
  5. 笔谈OpenGL ES(一)
  6. java最少有多少线程_【并发编程】一个最简单的Java程序有多少线程?
  7. jdbc postgresql mysql_mysql改为postgresql 语法常见问题
  8. 如何做一个MySQL优良数据库_MySQL数据库如何做好优化
  9. java session 超时_Javaweb项目session超时解决方案
  10. 基于Python的指数基金量化投资 - 指数投资技巧(一)定期定额
  11. 物理专业英语词汇(H-N)
  12. windows10怎么显示文件后缀(扩展名)?
  13. python爬虫监控平台_scrapy-monitor,实现爬虫可视化,监控实时状态
  14. bzoj4987 Tree 树形dp
  15. 《现代操作系统(中文第三版)》课后习题——第九章 安全
  16. 网站收录之采集新闻源工具
  17. R语言使用order函数按照两个数据列的值排序data.table数据(主变量降序排序、次变量升序排序)
  18. 春运赶火车小心这些骗术
  19. HarmonyOS应用开发系列课(进阶篇)综合考试参考答案
  20. dymola学习笔记第三天——胡言乱语篇

热门文章

  1. S5PV210刷机问题汇总(部分)
  2. matlab 韩明距离_Matlab计算两集合间的海明距离
  3. 2021-06-08 海明距离(汉明距离)
  4. 修改和删除数据表字段
  5. Android 自动广告轮播图
  6. frp客户端(frpc) 安装及使用
  7. raid卡下smart查询
  8. Agile and ASPICE 系列 - project management planning
  9. python数据类型转换——矩阵float转int
  10. B站路飞学城学习笔记-Python爬虫-爬取电影分类排名-