算法导论-动态规划-钢条切割问题
文章目录
- 一、钢条切割定义
- 二、具体步骤
- 1.思考
- 2.代码思考
- 3.动态规划求解
- 4.伪代码
- 三:总结:
一、钢条切割定义
图为价格表
给定一段长度是n的钢条和一个价格表,求切割方案使得收益达到最大(允许全不切割的情况存在)
二、具体步骤
1.思考
易知长度为n的钢条有2的n-1次方种选择方式,故不可穷举。
我们可以考虑一段长度为n的钢条切段,在第k处时切开,如图:
这样的话,在n1段的前k-1上寻找最佳解,同理,在n2段的后m-k上寻找最佳解。这样的话问题就成为了:将两段钢条看成两个独立的钢条问题,我们称钢条切割问题满足最优子结构。
还有另一种思路,采用更为简单的递归求解思想:
- 一段长度为i的不可分割的钢条
- 一段长度为n-i的混合钢条
2.代码思考
- 先看看第二种算法(简单易于理解)
在这里采用自顶而下的递归算法,但这里的算法是失败的,问题在于它花费了大量时间来重复计算
拿长度为4来举例,规模为1的重复计算有4个,规模为0的重复计算有8个。
其时间复杂度为2的n次方
3.动态规划求解
- 带备忘的自顶而下法:之前算法慢的主要原因是因为大量重复运算,所以可以在过程中保留子问题的解(通常在数组或者散列表中),需要子问题的解时会首先检查是否保存从而节省了时间。
- 自底而上法:这个问题一般需要恰当的定义子问题规模,使得子问题求解依赖于更小的子问题求解,将子问题的规模按从小到大来排序求解,求解一个问题时是依赖更小问题的解,所以每个问题只要求解一次。
4.伪代码
- 自顶而下法:
- 自下而上法:
算法复杂度为O(n平方)
三:总结:
时间复杂度都是n的平方,但是带备忘的自上而下法还是递归,自下而上则不是递归了。
算法导论-动态规划-钢条切割问题相关推荐
- 算法导论 动态规划钢条切割问题 C语言
动态规划钢条切割问题 动态规划(dynamic programming)与分治法类似.分治策略将问题划分为互不相交的子问题,递归求解子问题,再将子问题进行组合,求解原问题.动态规划应用于子问题重叠的情 ...
- 动态规划 — 钢条切割问题
动态规划: 什么是动态规划? 动态规划算法的基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息.在求解任一子问题时 ...
- 算法导论-动态规划(钢条切割问题)
写下文章来记录下自己学习算法导论的笔记 文章目录 写下文章来记录下自己学习算法导论的笔记 动态规划的目的 设计动态规划算法 钢条切割问题 问题描述 刻画问题结构(建立方程) 递归方程建立 带备忘录的自 ...
- 动态规划-钢条切割(java)
数据结构与算法系列源代码:https://github.com/ThinerZQ/AllAlgorithmInJava 本文源代码:https://github.com/ThinerZQ/AllAlg ...
- 动态规划 -- 钢条切割问题
给定一段长度为n英寸的钢条和一个价格表p,求切割钢条方案(钢条的长度均为整英寸),使得销售收益最大. 我们可以计算出长度为n英寸的钢条共有2的(n-1)次方种不同的切割方案. 为解决规模为n的原问题, ...
- 动态规划—钢条切割问题与01背包问题
目录 1.钢条切割问题 第一种求最优解方案: 第二种求最优解方案: 第一种方法是 带备忘的自顶向下法 第二种方法是 自底向上法 2.01背包问题 1,穷举法(把所有情况列出来,比较得到 总价值最大的情 ...
- 算法导论例题——钢管切割
<算法导论>(CLRS)中第一个dp例题(rodcutting)的C++代码 #include<iostream> #include<vector> #includ ...
- 算法导论动态规划切割钢条
保存已经求得的子问题解 自底向上 #ifndef _MODEL_ #define _MODEL_ #include<vector> #include<map> using st ...
- 动态规划——钢条切割
有一根钢条,和他的长度价格表,真么样切割才能使得售出的钢条收益最大. 不考虑钢条的切割损耗. 输入n 表示钢条的长度 价格表p[i] 表示长度为i的钢条出售的价格 ------------------ ...
最新文章
- 【OpenCV学习笔记2】OpenCV 完全安装 新增VS2010+OpenCV2.1,新增VS2010+OpenCV2.3.1
- Android socket 编程 实现消息推送(二)
- [050] 微信公众平台开发入门视频教程已公布
- linux 字符串string操作(截取、提取、长度计算等)
- 读人人都是产品经理__2
- 脸书推出VR视频会议应用程序 正式跨出元宇宙第一步;三家公司新入选福布斯2021云计算百强榜;微软挖来亚马逊云业务顶级高管贝尔...
- 处理对象(toString()方法详解和==与equals方法的区别)
- 机器学习基石作业二中的DECISION_STUMP实现
- python如何装sklearn_python安装sklearn
- linux /etc/profile文件,Linux 配置文件 /etc/profile
- vmware虚拟机里的LINUX不能上网的原因一:虚拟网卡设置
- Java怎么用继承回复信息_JAVA面向对象-继承
- html标签之常用标签
- Laravel5.4 导出Excel表格
- 停止MySQL正在执行的SQL语句
- 3点画矩形的lisp_在CAD中,如何在这个矩形里面再画三个这样的矩形
- 336亿的生意——你所不了解的Dapp这一年(下)
- 服装尺寸 html,国家标准服装尺寸表
- 高通量基因组测序中,什么是测序深度和覆盖度?
- JS语法之:require