首页 > 编程语言 >算法导论(第15章 动态规划)*

算法导论(第15章 动态规划)*

时间:2022-10-12 10:58:42浏览次数:55  
标签:15 钢条 求解 导论 问题 算法 最优 动态 切割

目录

动态规划(dynamic programming)与分治方法相似,都是通过组合子问题的解来求解原问题(在这里,“programming”指的是一种表格法,并非编写计算机程序)。

分治方法将问题划分为互不相交的子问题,递归地求解子问题,再将它们的解组合起来,求出原问题的解。
动态规划应用于子问题重叠的情况,即不同的子问题具有公共的子子问题(子问题的求解是递归进行的,将其划分为更小的子子问题)。在这种情况下,分治算法会做许多不必要的工作,它会反复求解那些公共子子问题。而动态规划算法对每个子子问题只求解一次,将其解保存在一个表格中,从而避免每次求解一个子子问题时都重新计算。

动态规划方法通常用来求解最优化问题(optimization problem)。这类问题可以有很多可行解,每个解都有一个值,我们希望寻找具有最优值的解。我们称这样的解为问题的一个最优解(an optimal solution),而不是最优解(the optimal solution),因为可能有多个解都达到最优值。

通常按如下四个步骤来设计一个动态规划算法:

  1. 刻画一个最优解的结构特征。
  2. 递归地定义最优解的值。
  3. 计算最优解的值,通常采用自底向上的方法。
  4. (回溯)利用计算出的信息构造一个最优解。——如果仅仅需要一个最优解的值,而非解本身,则不需要此步骤

15.1 钢条切割

对于长度为\(n\)英寸的钢条,共有\(2^{n - 1}\)种不同的切割方案。
对于切割长度为\(n\)英寸的钢条的最优收益\(r_n(n \geqslant 1)\),我们可以用更短的钢条的最优切割收益来描述:

\(r_n = max(p_n, r_1 + r_{n-1}, …, r_{n-1} + r_1)\)

第一个参数\(p_n\)对应不切割直接出售长度为\(n\)英寸的钢条的方案,其他\(n - 1\)个参数对应另外\(n - 1\)种方案:对每个\(i = 1, 2, …, n - 1\),首先将钢条切割为长度为\(i\)和\(n - i\)的两段,接着求解这两段的最优切割收益\(r_i\)和\(r_{n-i}\)——此时我们必须考察所有可能的\(i\),选取其中最大收益者。

注意到,为了求解规模为n的原问题,我们先求解形式完全一样,但规模更小的子问题。我们称钢条切割问题满足最优子结构(optimal substructure)性质:问题的最优解由相关问题的最优解组合而成,而这些子问题可以独立求解。

我们可以将问题分解的方式简化为:将长度为\(n\)的钢条分解为左边开始一段,以及剩余部分继续分解的结果,得到简化后的公式如下(在此公式中,原问题的最优解只包含一个相关子问题的解。):

\(r_n = max_{1 \leqslant i \leqslant n}(p_i, r_{n-i})\)

自顶向下递归实现

CUT-ROD(p, n)
1 if n == 0
2   return 0
3 q = -∞
4 for i = 1 to n
5   q = max(q, p[i] + CUT-ROD(p, n - i))
6 return q

此时,一旦输入规模稍微变大,程序运行时间会变得相当长。原因在于CUT-ROD反复地用相同的参数值对自身进行递归调用——它反复求解相同的子问题。

使用动态规划方法求解最优钢条切割问题

标签:15,钢条,求解,导论,问题,算法,最优,动态,切割
From: https://www.cnblogs.com/kirin-dev/p/Introduction-to-Algorithms_Chapter-15.html

相关文章

  • java求最大递增子序列算法
    求最大递增子序列:packagecom.test.algorithm;importjava.util.Arrays;/***CreatedbyAdministratoron2022/10/12.*/publicclassMaxIncrSub{/*......
  • 搜索中常见数据结构与算法探究(二)
    本文介绍了几个常见的匹配算法,通过算法过程和算法分析介绍了各个算法的优缺点和使用场景,并为后续的搜索文章做个铺垫;读者可以通过比较几种算法的差异,进一步了解匹配算法演......
  • 招聘:医疗CBCT算法工程师-40-60万-成都
    招聘:医疗行业职位分享,欢迎转发,欢迎推荐,谢谢!职位:某口腔医疗器械公司-CBCT算法工程师地点:成都年薪:40-60万职责:负责CBCT校正及重建算法的设计、实现。要求:熟悉CBCT几何校正、......
  • 招聘:CT图像算法工程师-30-70W-北京5人
    招聘:医疗行业职位分享,谢谢!职位:某大型医疗上市公司-CT图像算法工程师(招5人)地点:北京年薪:30-70W(看级别)职责:负责医学图像处理算法研发。要求:硕士以上,熟悉图像处理如图像增强,图像......
  • CSS笔记 - 15 知识点补充
    15.CSS其它知识点【概念】1.继承为一个元素设置的样式同时也会应用到它的后代元素上,这种特性称之为样式的继承继承发生在祖先和后代之间,利用继承可以将一些通用的......
  • 算法练习-第十六天【二叉树】
    二叉树的深度与高度二叉树的深度:从根节点到该节点的最长简单路径边的条数或节点数(取决于深度是否从1开始)二叉树的高度:从该节点到叶子节点的最长简单路径边的条数或节点数......
  • LeetCode算法笔记 566. 重塑矩阵
    importjunit.framework.TestCase;importjava.util.Arrays;publicclassLeetCode04_1extendsTestCase{/***566.重塑矩阵*在MATLAB中,有......
  • LeetCode算法笔记 121. 买卖股票的最佳时机
    importjunit.framework.TestCase;publicclassLeetCode03_2extendsTestCase{/***121.买卖股票的最佳时机*给定一个数组prices,它的第i......
  • 视频+课件|单目6D姿态估计算法详解
    写在前面感谢「3D视觉从入门到精通」知识星球嘉宾王谷博士为我们带来的主题为单目6D物体姿态估计算法视频讲解,星球成员可免费观看学习。备注:王谷博士,清华大学自动化系BBNCL......
  • 大厂HR:我们根本招不到合格的算法工程师
    在人工智能机器学习的领域中,目前最火的莫过于计算机视觉了,这项技术一直广受关注,而其中的目标检测是计算机视觉领域中最常见的问题之一。从去年的YOLOv4发布后,目标检测框架......