动态规划 - 切钢条 (python)
博主在读《算法导论》时,看到了切钢条的自底向上的伪代码,就分享给大家
BOTTOM-UP-CUT-ROD(p,n)
1. let r[0..n]be a new array
2. r[0] = 0
3. for j = 1 to n
4. q = 负无穷
5. for i = 1 to j
6. q = max(q, p[i]+r[j-i])
7. r[j] = q
8. return r[n]
然后,博主就根据这个伪代码来用python实现
def cutRodDP(p, n):r = [0]*(n+1)r[0] = 0for j in range(1,n+1):q = float('-inf')for i in range(1,j+1):q = max(q, p[i]+r[j-i])r[j] = qreturn r[n]p = [0,1,5,8,9,10,17,17,20,24,30]
n = 3
print(cutRodDP(p,n)) # 结果是8
同时,在《算法导论》里也看到了自顶向下的伪代码,分享给大家
MEMOIZED-CUT-ROD(p,n)
1. let r[0..n]be a new array
2. for i = 0 to n
3. r[i] = 负无穷
4. return MEMOIZED-CUT-ROD-AUX(p,n,r)MEMOIZED-CUT-ROD-AUX(p,n,r)
5. if r[n] >= 0
6. return r[n]
7. if n == 0
8. q = 0
9. else q = 负无穷
10. for i = 1 to n
11. q = max(q, p[i]+MEMOIZED-CUT-ROD-AUX(p,n-i,r))
12. r[n]=q
13. return q
用python来实现上面的代码
def cutTopDown(p,n):r = [0]*(n+1)for i in range(0, n+1):r[i] = float('-inf')return helper(p,n,r)def helper(p,n,r):if r[n] >= 0:return r[n]q = float('-inf')if n == 0:q = 0else:q = float('-inf')for i in range(1, n+1):q = max(q, p[i] + helper(p, n - i, r))r[n] = qreturn q p = [0,1,5,8,9,10,17,17,20,24,30]
n = 3
print(cutTopDown(p,n))
获取切割方案。
伪代码:
EXTENDED-BOTTOM-UP-CUT-ROD(p,n)
1. let r[0..n]ands[0..n]be new arrays
2. r[0]=0
3. for j = 1 to n
4. q = 负无穷
5. for i = 1 to j
6. if q < p[i]+r[j-i]
7. q=p[i]+r[j-i]
8. s[j]=i
9. r[j]=q
10. return r and sPRINT-CUT-ROD-SOLUTION(p,n)
11. (r,s)=EXTENDED-BOTTOM-UP-CUT-ROD(p,n)
12. while n>0
13. print s[n]
14. n=n-s[n]
根据上面的伪代码来实现出来
def extendedBottonUp(p,n):r = [0]*(n+1)s = [0]*(n+1)r[0] = 0for j in range(1, n+1):q = float('-inf')for i in range(1, j+1):if q < p[i] + r[j-i]:q = p[i]+r[j-i]s[j]=ir[j] = qreturn r,s def printCut(p,n):(r,s) = extendedBottonUp(p,n)while n > 0:print(s[n])n = n - s[n]p = [0,1,5,8,9,10,17,17,20,24,30]
n = 4
printCut(p,n) # 结果 2,2
看到这就麻烦点个赞或者关注来支持一下!谢谢各位~~
动态规划 - 切钢条 (python)相关推荐
- 算法导论15.1动态规划之钢条切割
动态规划与钢条切割 1.分治算法与动态规划 相同点: 都是通过组合子问题的解来求解原问题 不同: 1.分治将问题划分为互不相交的子问题,递归地求解子问题,在将它们的解组合起来,求出原问题. 2.动态规 ...
- 算法导论-动态规划(钢条切割问题)
写下文章来记录下自己学习算法导论的笔记 文章目录 写下文章来记录下自己学习算法导论的笔记 动态规划的目的 设计动态规划算法 钢条切割问题 问题描述 刻画问题结构(建立方程) 递归方程建立 带备忘录的自 ...
- 动态规划算法---钢条切割
算法进阶---动态规划算法 钢条切割问题: 程序实现: 钢条切割问题: 程序实现: 方法一和方法二是对程序实现的不断深入,逐渐降低算法实现的时间复杂度. p = [0, 1, 5, 8, 9, 10, ...
- 0-1背包问题动态规划模型的Python解法
0-1背包问题动态规划模型的Python解法 1.01背包问题 2.Python解决方案 3.01背包问题例题 1.01背包问题 背包问题(Knapsack problem)是一种组合优化的NP完全问 ...
- leetcode 切钢条问题
leetcode 切钢条问题 题目描述:某公司购买了长钢条,将其切割为短钢条出售.切割工序本身没有成本支出.公司管理层希望知道最佳的切割方案.假定我们知道出售一段长为i英寸的钢条的价格为pi,钢条的长 ...
- 数据结构(python) —— 【34: 动态规划之钢条切割问题】
钢条切割问题 1. 问题 某公司出售钢条,出售价格与钢条长度之间的关系如下表: 问题:现有一段长度为n的钢条和上面的价格表,求切割钢条方案,使得总收益最大. 2. 思路 思考: 长度为n的钢条的不同切 ...
- Python数据结构与算法-动态规划(钢条切割问题)
一.动态规划(DP)介绍 1.从斐波那契数列看动态规划 (1)问题 斐波那契数列递推式: 练习:使用递归和非递归的方法来求解斐波那契数列的第n项 (2)递归方法的代码实现 import time # ...
- 动态规划(钢条切割问题 Java/Python/Golang)
问题描述(引用算法导论描述):给定一段长度为n英寸的钢条(一个整型)和一个价格表p(一个数组)求钢条最优切割方案,使得销售的收益最大,如果n英寸的钢条的价格p[n]足够大,那么钢条有可能不需要切割 J ...
- 《算法导论》学习(十七)----动态规划之钢条切割(C语言)
文章目录 前言 一.钢条切割问题 1.问题背景 2.问题描述 3.问题的难点 (1)情况较多 (2)消除重复子问题 二.问题解决方案 1.问题的特点 (1)最优化子结构 (2)重复子问题 2.最优化解 ...
最新文章
- 简易django项目之登录验证
- DirectFB编译环境
- java lambda函数_最常用的 Java 8 中的 Lambda 函数(项目中实用笔记)
- NYOJ 641 摧毁网络
- StoryBoard之User Defined Runtime Attributes的使用
- iso图像测试卡_4700万像素 五轴防抖 徕卡正式发布SL2无反相机
- 【非科班告诉你】前端自学从小白到入门
- 编译技术算符优先分析课设c++_2020年河北省专接本理工类计算机科学与技术软件工程专业考试大纲...
- FFmpeg简介及常见用法
- VS2005 添加lib 的方法
- php圆角的度数计算公式,弧度和角度的换算器(度数换算计算器)
- 如何不用ps来吸取颜色并将颜色一键插入到网页,自动生成代码?
- 【微信小程序】数据绑定
- win10查看计算机管理员,肿么查看win10微软账户是否为管理员账户
- OpenCV之Vec3f
- MarkDown CheatSheet 速查表
- android 高德地图范围圆圈公里_根据坐标点显示地图显示范围(高德地图)
- 滴滴老年版来了,推出一键打车小程序,电话叫车服务
- php 感叹号有什么用,感叹号!代表什么意思?(标点符号的用法之感叹号)
- 男程序员用双手虐了多少女明星?