动态规划算法Dynamic Programming

一、动态规划概述

动态规划常常与分治策略、贪心算法同时提及,三种算法都是通过组合子问题的解来求解原问题。在解决某些问题时,其子问题有大量的重叠情况,此时单纯使用分治策略会发现随着输入数据量的增大,运行时间呈指数级增长。动态规划是一种典型的用空间换时间的权衡策略。其核心思想就是将那些重复的子问题的解,记录下来,当需要再次相同子问题时,查表获取结果即可。动态规划通常用来求解最优化问题,适用问题通常有以下两个特点:1.具有最优子结构性质:问题的最优解由相关子问题的最优解组合而成。2.有大量的重叠子问题。二、钢条切割问题问题:Serling公司购买长钢条,将其切割为短钢条出售。假设切割工序没有成本,不同长度的钢条的售价如下:
钢条的价格
问题分析:考虑 n = 4 的情况,那么有以下几种切割方式:

1.切割为四段,长度为:1,1,1,1;总共卖41=4元。
2.切割为三段,长度为:1,1,2;总共卖2
1+15=7元。
3.切割为两段,长度为:1,3;总共卖1
1+18=9元。
4.切割为两段,长度为:2,2;总共卖2
5=10元。
5.不切割,长度为:4;总共卖1*9=9元。
更一般的,对于r(n),我吗可以利用更短的钢条的最优化切割收益来描述它:
r(n)=max{p(n),r(1)+r(n-1),r(2)+r(n-2),…,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,选取其中收益最大者。如果直接出售最大,我们就不做任何切割。
在这里插入图片描述

二、自顶向下递归实现:

伪代码如下

infinity = 1e+16 #无穷大

CUT-ROD(p, n)
  if n == 0
      return 0
  q = -infinity
  for i = 1 to n
      q = max(q, p[i] + CUT-ROD(p, n-i))
  return q

在这里插入图片描述
重复计算问题
重复计算问题

三、动态规划算法一:带备忘录的自顶向下法

伪代码如下

infinity = 1e+16 #无穷大

MEMOIZED-CUT-ROD(p, n)
  let r[0..n] be a new array
  for i = 0 to n
      r[i] = -infinity
  return MEMOIZED-CUT-ROD-AUX(p, n
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值