算法:动态规划(1.钢条切割)
【齐天的博客】转载请注明出处(万分感谢!):
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 |
思考方式
- 由大化小,因为这种切割问题满足最优子结构性质,所以我们寻找更小一些的子问题,寻找循环不变的问题,即无论哪一次切割,我切割之后会产生两段钢条,而这两段钢条产生了最大的收益,之后这两段钢条再去循环上述过程,直到切割完成;
- 递归,将钢条切成两块,递归这个过程,最后比较结果产生最优解
- 动态规划
前两种属于朴素递归方法,反复求解相同的子问题,效率很低,运行时间为n的指数函数,而动态规划每次执行都存储了结果,在下次运行相同子问题是会直接使用结果而不用重复计算,提高了效率
实现方式
动态规划有两种等价的实现方式
- 自顶向下,备忘录式
- 自底向上
自顶向下:仍然按照递归形式,过程中保存没格子问题的解,而后遇到子问题都回去查是否之前保存过,节省时间,所以又称是带有备忘录的算法
自底向上:这种方法需要把子问题按照规模排序,由小到大进行求解,因为大问题会依赖与小规模的问题,由于小问题已经求解完毕也相当于存储了之前的结果。
这两种方式渐进运行时间相同,但考虑细节,后者没有频繁递归,所以时间复杂度有更小的系数,当然次数越大系数就越不重要
这里贴出来后者实现解决问题的代码供参考
/*** 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.钢条切割)相关推荐
- Python数据结构与算法-动态规划(钢条切割问题)
一.动态规划(DP)介绍 1.从斐波那契数列看动态规划 (1)问题 斐波那契数列递推式: 练习:使用递归和非递归的方法来求解斐波那契数列的第n项 (2)递归方法的代码实现 import time # ...
- 算法导论15.1动态规划之钢条切割
动态规划与钢条切割 1.分治算法与动态规划 相同点: 都是通过组合子问题的解来求解原问题 不同: 1.分治将问题划分为互不相交的子问题,递归地求解子问题,在将它们的解组合起来,求出原问题. 2.动态规 ...
- 《算法导论》中动态规划求解钢条切割问题
动态规划算法概述 动态规划(dynamic programming)1是一种与分治方法很像的方法,都是通过组合子问题的解来求解原问题.不同之处在于,动态规划用于子问题重叠的情况,比如我们学过的斐波那契 ...
- 算法导论-动态规划(钢条切割问题)
写下文章来记录下自己学习算法导论的笔记 文章目录 写下文章来记录下自己学习算法导论的笔记 动态规划的目的 设计动态规划算法 钢条切割问题 问题描述 刻画问题结构(建立方程) 递归方程建立 带备忘录的自 ...
- 《算法导论》学习(十七)----动态规划之钢条切割(C语言)
文章目录 前言 一.钢条切割问题 1.问题背景 2.问题描述 3.问题的难点 (1)情况较多 (2)消除重复子问题 二.问题解决方案 1.问题的特点 (1)最优化子结构 (2)重复子问题 2.最优化解 ...
- 动态规划:钢条切割问题
一.题目 钢条切割问题 是<算法导论>一书中介绍动态规划时的一道引题.即: 某公司购买长钢条,将其切割为短钢条出售.假设切割工序没有成本支出,已知长度为 i 的钢条出售价格为 pi ,钢条 ...
- 数据结构(python) —— 【34: 动态规划之钢条切割问题】
钢条切割问题 1. 问题 某公司出售钢条,出售价格与钢条长度之间的关系如下表: 问题:现有一段长度为n的钢条和上面的价格表,求切割钢条方案,使得总收益最大. 2. 思路 思考: 长度为n的钢条的不同切 ...
- 【动态规划】钢条切割问题
本人在学习<算法导论>的过程中,对于动态规划这部分的内容不是特别理解,于是决定做一下学习与解决记录,欢迎讨论交流. 文章目录 0- 动态规划问题的一般步骤 1- 问题描述 2-问题分析 3 ...
- 贪心、动态规划:钢条切割
题目描述 Serling公司购买长钢条,将其切割为短钢条出售.切割工序本身没有成本支出.公司管理层希望知道最佳的切割方案. 假定我们知道Serling公司出售一段长为i英寸的钢条的价格为pi(i=1, ...
最新文章
- 只需4步,自己搞个 Spring Boot Starter !
- vs生成解决方案出错
- Windbg/KD驱动调试点滴–将平时调试的一些小方法共享给大家 --------- 转
- virtual DOM和真实DOM的区别_让虚拟DOM和DOMdiff不再成为你的绊脚石
- 一秒点击屏幕次数_手机屏幕刷新率那点事儿!
- fake it till you become it
- javaI/O之PushbackInputStream
- http报文和协议首部
- 使用ShellExecuteEx打开文件或者其他
- 见习经理_第一天洗了整天碗
- Java面向对象(一)20170517
- 傻瓜式操作的三个网络赚零花钱的小项目
- 哨兵2号(Sentinel-2)介绍、下载、预处理及批处理
- Python数据库编程
- NSGA_2 Matlab带约束问题的多目标优化求解方案+惩罚函数
- 站在巨人的肩膀上--邵泓鑫
- LINUX中ECHO命令的使用
- 论文笔记 -- Fast-LIO -- ESIKF溯源
- @CacheEvict-缓存
- 蠕虫病毒 incaseformat 在国内肆虐,可导致用户数据丢失
热门文章
- 玩转华为ENSP模拟器系列 | 配置BFD for OSPF特性示例
- 利用Matlab编程实现对NetCDF数据针对某一坐标按时间提取风、流、水蒸气等变量信息
- 屁精 apple-polisher
- matlab灰度变换函数imadjust、stretchlim
- 曾国藩修身养性十三条
- 麒麟子Cocos Creator实用技巧四:打包原生App截图白屏解决方案
- python 下列表达式的值为true的是_下列表达式的值为True的是
- vue.runtime.esm.js?2b0e:619 [Vue warn]: Error in created hook: TypeError: Object(...) is not a func
- NodeJS中的图片操作库
- 【知识图谱】本周文献阅读笔记(4)——周三 2023.1.11:英文)基于动态知识图谱的虚假评论检测 + 基于知识图谱的推荐系统研究综述 + 基于知识图谱的推荐算法研究综述+新一代知识图谱关键技术