当前位置:   article > 正文

[Golang] 《算法导论》动态规划(Dynamic Programming)理解 (一)_golang dynamic programmin

golang dynamic programmin

本篇内容为阅读《算法导论》动态规划算法设计时的一些理解和记录。建议大家去看原书,真的好。

动态规划有点像分治法,都是通过合并原问题的子问题的解来得到原问题的解。不同的是分治法将原问题划分为不相交的子问题,递归地解决子问题,然后组合它们的解来得到原问题的解。而动态规划需要原问题划分为有重叠的子问题,即其子问题又需要共同的子子问题。

当划分的子问题有重叠时,使用分治法会导致重叠子问题的重复计算。动态规划实际上就是通过存储子问题的解来避免这样的重复计算,这是动态规划的基本思想。

动态规划一般用于求一个最优解的问题,解决这样的问题包含四步:

  • 归纳出一个最优解的结构。
  • 递归定义一个最优解的值。
  • 计算一个最优解的值。(一般使用从底向上的方式)
  • 从结算中构建出最优解。

这样直白的语言概括其实很难理解的,还需要根据例子来理解,《算法导论》中给出了几个例子,我们也借用他来记录一下。

例一

将一根长度为 n 的铁棒进行分割,不同长度可以卖不同的价格(遵循一个价格表 P ),问可以卖出的最大的价格是多少?(一个最优解的问题)

设长度为 n 的铁棍通过切割最多能卖出的价格为 rn,第一次分割的长度为 i ,其余部分为 n-i。其中 i 的范围是 [1,n],那我们可以表示出 rn

rn = max (pi + rn-i)

注意i 的范围是 [1,n],这里的max要求的是例如p1 + rn-1,p2 + rn-2,… 之类的最大值。

很显然,这是个递归,我们很容易写出代码(Go):

func cutRod(p []int, n int) int {
   
  if n == 0 {
   
     return 0
  }
  q := math.MinInt
  for i := 1;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/500412
推荐阅读
相关标签
  

闽ICP备14008679号