动态规划的理解与设计方案

动态规划算法设计

设计要素
  1. 问题建模,优化的目标函数是什么?约束条件是什么?
  2. 如何划分子问题(边界) ?
  3. 问题的优化函数值与子问题的优化函数值存在着什么依赖关系?(递推方程)
  4. 是否满足优化原则?
  5. 最小子问题怎样界定?其优化函数值,即初值等于什么?
矩阵链相乘

问题:设A1,A2,……,An为矩阵序列,Ai为Pi-1 X Pi阶矩阵,i =1,2,…,n.
试确定矩阵的乘法顺序,使得元素相乘的总次数最少。

输入:向量
P=< P0,P1,……,Pn>,其中P0,……Pn为n个矩阵的行数与列数

输出:矩阵链乘法加括号的位置.

动态规划算法
子问题划分

Ai… j:矩阵链AiAi+1…Aj,边界i,j

输入向量:< Pi-1,Pi,…Pj>
其最好划分的运算次数: m[i,j]

子问题的依赖关系

最优划分最后一次相乘发生在矩阵k的位置,即
Ai…j=Ai…k Ak+1…j
k+1.j
Ai…j最优运算次数依赖于Ai…k与Ak+1…j的最优运算次数

动态规划算法设计要素
  • 多阶段决策过程,每步处理一个子问题,界定子问题的边界
  • 列出优化函数的递推方程及初值
  • 问题要满足优化原则或最优子结构性质,即:一个最优决策序列的任 何子序列本身一定是相对于子序列的初始和结束状态的最优决策序列

动态规划算法的递归实现

  1. 动态规划算法的递归实现效率不高,原因在于同一子问题多次重复出现,每次出现都需要重新计算一遍.
  2. 采用空间换时间策略,记录每个子问题首次计算结果,后面再用时就直接取值,每个子问题只算一-次.

动态规划算法的迭代实现

迭代计算的关键
  • 每个子问题只计算一次

  • 迭代过程
    从最小的子问题算起
    考虑计算顺序,以保证后面用到的值
    前面已经计算好
    存储结构保存计算结果——备忘录

  • 解的追踪
    设计标记函数标记每步的决策
    考虑根据标记函数追踪解的算法

两种实现的比较

递归实现:时间复杂性高,空间较小
迭代实现:时间复杂性低,空间消耗多

原因:递归实现子问题多次重复计算,子问题计算次数呈指数增长。迭代实现每个子问题只计算一次。

动态规划时间复杂度:
备忘录各项计算量之和+追踪解工作量
通常追踪工作量不超过计算工作量,是问题规模的多项式函数

动态规划算法的要素

  • 划分子问题,确定子问题边界,将问 题求解转变成多步判断的过程
  • 定义优化函数,以该函数极大(或极小 值作为依据,确定是否满足优化原则
  • 列优化函数的递推方程和边界条件
  • 自底向上计算,设计备忘录(表格)
  • 考虑是否需要设立标记函数
  • 用递推方程或备忘录估计时间复杂度
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值