文章目录

  • 前言
  • 一、动态规划是什么?
  • 二、经典例子
    • 爬楼梯问题
    • 挖金矿问题
  • 三、总结

前言

在leetcode刷题的过程中,碰到了许多动态规划相关的题目,故系统性的学习了动态规划算法。此文章总结了学习过程中的一些思路,尽可能以例子的形式展现出来。如有错误之处,还望指正~


一、动态规划是什么?

动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的过程。
动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。

在我看来,动态规划主要分为两个部分。

  1. 确定边界
  2. 找到状态转移方程

tips:动态规划是一个自底向上的过程

二、经典例子

爬楼梯问题

题目描述:有10阶楼梯,每次只能爬一层或两层,请问爬完10阶楼梯共有多少种方式?

思路:
F(n)表示爬到第几阶楼梯的种数
那么F(1)就为爬到第一层的种数,显然F(1)=1,即只有爬一层有一种方式
那F(2)为多少呢?F(2)=F(1)+1,即从第一层爬一层或从第0层爬两层。
那么可以得到下面的状态转移方程:

F(n) = 1, n = 1
F(n) = 2, n = 2;
F (n) = F(n-1) + F(n-2)

很容易可以得到以下的代码

public int getClimbWays(int n) {if (n < 1) {return 0;}if (n == 1) {return 1;}if (n == 2) {return 2;}int a = 1;int b = 2;int temp = 0;for (int i=3; i<n; i++) {temp = a+b;a = b;b = temp;}return temp;}

以10层为例,输出结果为55

挖金矿问题

题目:有10名矿工挖一批金矿,金矿如下400/5、500/5、200/3、300/4、450/3(金额/所需人数),金矿只能挖或者不挖。请问最多能挖多少金子?

思路:不妨给金矿排个序,即1~5号。那么10个矿工挖5个金矿的收益,等于7个矿工挖四个金矿的收益+350与10个矿工挖四个金矿的最大值。这么说可能不够清楚,不妨填一下下面的表格(n表示金矿个数,w表示人数)

添好后的结果如下所示,显然n=5,w=9时的结果,是在6(9-3)个人挖4个金矿+450,与9个人挖4个金矿中取最大值,即max(500+450, 800)=950

可以得到如下的状态转移方程:

n 挖金矿的个数
w 挖金矿的矿工人数
g 金矿的含量
p 金矿所需的人d[n][w] = 0, n < 1
d[n][w] = n > p[0] ? g[0] : 0, n = 1
d[n][w] = max(d[n-1][w], p[n]+d[n-1][w-g[n]]), n>2

实现代码如下所示:

public int getBiggestGold(int w, int[] g, int[] p) {// 如果不需要挖没有金矿,返回0if (g.length < 1)return 0;int[] preResults = new int[w + 1];int[] results = new int[w + 1];// 首次循环,填充第一行的值for(int i=0; i<=w; i++) {if (i < p[0]) {preResults[i] = 0;} else {preResults[i] = g[0];}}// 填充其余格子值,外层是金矿数量,内层是人工数for (int i=1; i<g.length; i++) {results = new int[w + 1];for (int j=0; j <= w; j++) {if (j < p[i]) { // 人不够,没采results[j] = preResults[j];} else { // 人够了,选择采或者不采的最大收益results[j] = Math.max(preResults[j], preResults[j-p[i]] + g[i]);}}preResults = results;}return results[w];}

易得,收益的最大值为950。

那么如何知道具体挖了哪些金矿呢?评论区告诉我8~

三、总结

在我看来,其实动态规划就是一个自底向上的过程,注意边界即可。~

算法-动态规划学习(含经典例子分析)相关推荐

  1. <贪心算法>学习及经典实例分析

    前言 人生如逆旅,我亦是行人. 贪心算法(Greedy Algorithm) 贪心算法(Greedy Algorithm,又称贪婪算法):是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说 ...

  2. 贪心算法及几个经典例子

    贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在 当前看来是最好的选择 .也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的 局部最优解 . 贪心算法没有固定的算法框 ...

  3. 贪心算法及几个经典例子c语言

    贪心算法 一.基本概念: 所谓贪心算法是指,在对问题求解时,总是做出在 当前看来是最好的选择 .也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的 局部最优解 . 贪心算法没有固定的算法框 ...

  4. 分治算法详细讲解(含经典例题分析)

    分治法思路: 将整个问题分解成若干小问题后再分而治之.如果分解得到的子问题相对来说还是太大,则可反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生方便求解的子问题,必要时逐步合并这些子问题的 ...

  5. 动态规划学习笔记 // /经典问题/状态表示/状态转移方程

    因为网络原因,图片以及部分经典问题没有上传成功,详见PDF. 首先要做的是--写出状态表示和状态转移方程,有可能会引入k,即对于子问题的界定.--状态值dp[][]要和题目所求内容的要求符合! 子问题 ...

  6. Boston_House_Price经典例子分析

    最近学习了线性回归,然后拿经典数据集来练习. 数据集大小为[506,13],一共506个样本,13个特征(['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'D ...

  7. 【机器学习实战】KNN算法的两个经典例子(电影类型判断,约会网站的改进)

    KNN算法的两个常用实际例子 一.使用K-邻近算法来对电影的类型进行判断 1.实验思路: 2.代码实现: 3.运行截图: 4.完整代码展示: 二.在约会网站上使用KNN算法 (一)准备数据:从文本文件 ...

  8. OpenCV与图像处理学习九——连通区域分析算法(含代码)

    OpenCV与图像处理学习九--连通区域分析算法(含代码) 一.连通区域概要 二.Two-Pass算法 三.代码实现 一.连通区域概要 连通区域(Connected Component)一般是指图像中 ...

  9. StreamDM:基于Spark Streaming、支持在线学习的流式分析算法引擎

    StreamDM:基于Spark Streaming.支持在线学习的流式分析算法引擎 streamDM:Data Mining for Spark Streaming,华为诺亚方舟实验室开源了业界第一 ...

最新文章

  1. Netty - I/O模型之BIO
  2. HTTP详解-工作原理
  3. Python 爬虫---(7) Python3网络爬虫快速入门实战解析
  4. 精述字符编码(读这篇就够了)
  5. verilog之状态机详细解释(一)
  6. springboot 指定 logback_spring boot与日志
  7. centos mysql5.5 编译安装_centos6.4下编译安装MySQL-5.5.33
  8. 麦肯锡:数字化转型四步法!
  9. 2018圆通科技面试题目
  10. 百词斩不复习_有人用过百词斩和不背单词两款背单词app吗?良心推荐哪一个好一点?...
  11. Java中frame和panel区别,JFrame 和JPanel 的关系-区别(学习笔记)
  12. 网站java验证码不显示_jsp验证码无法显示
  13. MySQL使用存储过程造数据
  14. 微信支付签约委托代扣文档 - 月付会员或者定期支付服务 - APP纯签约
  15. arduino教程-13. 蓝牙
  16. Kotlin 1.4 和未来值得期待的地方
  17. 数值计算之 插值法(1)多项式插值——拉格朗日插值法
  18. 安徽大学信息安全专业本科生攻略
  19. linux系统使用实验报告操作系统,linux操作系统实验报告1.doc
  20. core razor是什么_什么是Blazor和什么是Razor Components?

热门文章

  1. 知识图谱顶会论文(ACL-2022) ACL-SimKGC:基于PLM的简单对比KGC
  2. P2P网贷第三方托管模式存在5大缺陷,托管机构才是最大赢家
  3. 细说Mybatis一级缓存、二级缓存以及mybatis获取mapper的面向接口编程思想(Mapper接口动态代理实现原理)(二)
  4. Message: session not created exception: Missing or invalid capabilities (Driver info: chromedrive
  5. 双十一预售单品榜单出炉,极米H3S成投影品类爆款位列智能投影Top 1
  6. anacoda里面安装包显示失败_Photoshop解决安装失败!怎么办?!!!
  7. yunfile php,yunfile解析出真实地址,却不能下载,访问会出错...
  8. 仙游一中,郑毓煌:“演义”人生
  9. python读取文件夹下的文件名写入excel(高效办公)
  10. Android开发五年,分享一些行业经验