【齐天的博客】转载请注明出处(万分感谢!):
https://blog.csdn.net/qijinglai/article/details/94324251

Dynamic programming 动态规划,与分治法相似,都是通过组合子问题的解来求解原问题,但动态规划是应用于子问题重叠的场景,每个子问题都只求一遍,将解存入表格中,避免不必要的重复工作。

问题:购买长钢条,将其切割为短钢条出售,不同长度的钢条对应不同的价格,希望得到最佳的切割方案使利润最大化。

长度 i 1 2 3 4 5 6 7 8 9 10
价格 p 1 5 8 9 10 17 17 20 24 30

先把结果放出来

钢条长度 切割方案 最大价值
1 1 1
2 2 5
3 3 8
4 2+2 10
5 2+3 13
6 6 17
7 1+6或2+2+3 18
8 2+6 22
9 3+6 25
10 10 30

思考方式

  1. 由大化小,因为这种切割问题满足最优子结构性质,所以我们寻找更小一些的子问题,寻找循环不变的问题,即无论哪一次切割,我切割之后会产生两段钢条,而这两段钢条产生了最大的收益,之后这两段钢条再去循环上述过程,直到切割完成;
  2. 递归,将钢条切成两块,递归这个过程,最后比较结果产生最优解
  3. 动态规划

前两种属于朴素递归方法,反复求解相同的子问题,效率很低,运行时间为n的指数函数,而动态规划每次执行都存储了结果,在下次运行相同子问题是会直接使用结果而不用重复计算,提高了效率

实现方式

动态规划有两种等价的实现方式

  1. 自顶向下,备忘录式
  2. 自底向上

自顶向下:仍然按照递归形式,过程中保存没格子问题的解,而后遇到子问题都回去查是否之前保存过,节省时间,所以又称是带有备忘录的算法

自底向上:这种方法需要把子问题按照规模排序,由小到大进行求解,因为大问题会依赖与小规模的问题,由于小问题已经求解完毕也相当于存储了之前的结果。

这两种方式渐进运行时间相同,但考虑细节,后者没有频繁递归,所以时间复杂度有更小的系数,当然次数越大系数就越不重要

这里贴出来后者实现解决问题的代码供参考


/*** author: Qit .* date:   On 2019/6/28*/
public class Test {static int q;static int[] p = new int[]{0, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30};static int[] r = new int[p.length];public static void main(String[] args) {System.out.printf(getMaxValue(5) + "");}private static int getMaxValue(int length) {return memoized_aux(length, r, p);}private static int memoized_aux(int n, int[] r, int[] p) {if (r[n] > 0) {return r[n];}if (n == 0)return q = 0;elsefor (int i = 1; i <= n; i++) {q = Math.max(q, p[i] + memoized_aux(n - i, r, p));}r[n] = q;System.out.println(n + "---" + r[n]);return q;}
}

算法:动态规划(1.钢条切割)相关推荐

  1. Python数据结构与算法-动态规划(钢条切割问题)

    一.动态规划(DP)介绍 1.从斐波那契数列看动态规划 (1)问题 斐波那契数列递推式: 练习:使用递归和非递归的方法来求解斐波那契数列的第n项 (2)递归方法的代码实现 import time # ...

  2. 算法导论15.1动态规划之钢条切割

    动态规划与钢条切割 1.分治算法与动态规划 相同点: 都是通过组合子问题的解来求解原问题 不同: 1.分治将问题划分为互不相交的子问题,递归地求解子问题,在将它们的解组合起来,求出原问题. 2.动态规 ...

  3. 《算法导论》中动态规划求解钢条切割问题

    动态规划算法概述 动态规划(dynamic programming)1是一种与分治方法很像的方法,都是通过组合子问题的解来求解原问题.不同之处在于,动态规划用于子问题重叠的情况,比如我们学过的斐波那契 ...

  4. 算法导论-动态规划(钢条切割问题)

    写下文章来记录下自己学习算法导论的笔记 文章目录 写下文章来记录下自己学习算法导论的笔记 动态规划的目的 设计动态规划算法 钢条切割问题 问题描述 刻画问题结构(建立方程) 递归方程建立 带备忘录的自 ...

  5. 《算法导论》学习(十七)----动态规划之钢条切割(C语言)

    文章目录 前言 一.钢条切割问题 1.问题背景 2.问题描述 3.问题的难点 (1)情况较多 (2)消除重复子问题 二.问题解决方案 1.问题的特点 (1)最优化子结构 (2)重复子问题 2.最优化解 ...

  6. 动态规划:钢条切割问题

    一.题目 钢条切割问题 是<算法导论>一书中介绍动态规划时的一道引题.即: 某公司购买长钢条,将其切割为短钢条出售.假设切割工序没有成本支出,已知长度为 i 的钢条出售价格为 pi ,钢条 ...

  7. 数据结构(python) —— 【34: 动态规划之钢条切割问题】

    钢条切割问题 1. 问题 某公司出售钢条,出售价格与钢条长度之间的关系如下表: 问题:现有一段长度为n的钢条和上面的价格表,求切割钢条方案,使得总收益最大. 2. 思路 思考: 长度为n的钢条的不同切 ...

  8. 【动态规划】钢条切割问题

    本人在学习<算法导论>的过程中,对于动态规划这部分的内容不是特别理解,于是决定做一下学习与解决记录,欢迎讨论交流. 文章目录 0- 动态规划问题的一般步骤 1- 问题描述 2-问题分析 3 ...

  9. 贪心、动态规划:钢条切割

    题目描述 Serling公司购买长钢条,将其切割为短钢条出售.切割工序本身没有成本支出.公司管理层希望知道最佳的切割方案. 假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1, ...

最新文章

  1. 只需4步,自己搞个 Spring Boot Starter !
  2. vs生成解决方案出错
  3. Windbg/KD驱动调试点滴–将平时调试的一些小方法共享给大家 --------- 转
  4. virtual DOM和真实DOM的区别_让虚拟DOM和DOMdiff不再成为你的绊脚石
  5. 一秒点击屏幕次数_手机屏幕刷新率那点事儿!
  6. fake it till you become it
  7. javaI/O之PushbackInputStream
  8. http报文和协议首部
  9. 使用ShellExecuteEx打开文件或者其他
  10. 见习经理_第一天洗了整天碗
  11. Java面向对象(一)20170517
  12. 傻瓜式操作的三个网络赚零花钱的小项目
  13. 哨兵2号(Sentinel-2)介绍、下载、预处理及批处理
  14. Python数据库编程
  15. NSGA_2 Matlab带约束问题的多目标优化求解方案+惩罚函数
  16. 站在巨人的肩膀上--邵泓鑫
  17. LINUX中ECHO命令的使用
  18. 论文笔记 -- Fast-LIO -- ESIKF溯源
  19. @CacheEvict-缓存
  20. 蠕虫病毒 incaseformat 在国内肆虐,可导致用户数据丢失

热门文章

  1. 玩转华为ENSP模拟器系列 | 配置BFD for OSPF特性示例
  2. 利用Matlab编程实现对NetCDF数据针对某一坐标按时间提取风、流、水蒸气等变量信息
  3. 屁精 apple-polisher
  4. matlab灰度变换函数imadjust、stretchlim
  5. 曾国藩修身养性十三条
  6. 麒麟子Cocos Creator实用技巧四:打包原生App截图白屏解决方案
  7. python 下列表达式的值为true的是_下列表达式的值为True的是
  8. vue.runtime.esm.js?2b0e:619 [Vue warn]: Error in created hook: TypeError: Object(...) is not a func
  9. NodeJS中的图片操作库
  10. 【知识图谱】本周文献阅读笔记(4)——周三 2023.1.11:英文)基于动态知识图谱的虚假评论检测 + 基于知识图谱的推荐系统研究综述 + 基于知识图谱的推荐算法研究综述+新一代知识图谱关键技术