动态规划解题思路、与分治法的区别;问题实例(1):钢条切割

1、动态规划与分治法的区别:
都利用递归,但分治法的子问题不重复,动规的子问题重复,因此需要表格/数组/矩阵保存子问题的解,以避免重新计算。
在这里插入图片描述
2、动态规划解题思路:
最重要的是找到状态转移方程。
在这里插入图片描述

  • 能应用该方法解题的问题特征:
    动态规划用于解决最优化问题。当问题描述中出现“···使得···最好、最优”时,可以思考利用动态规划方法解题。
  • DP自底向上的求解方法:
    DP将大问题分解成子问题,先求解子问题,再逐步扩大。(从小问题到大问题,常利用for循环遍历)。
  • 需要建立表格保存子问题的解:
    大问题的解常用到小问题的解,因此需要==表格/数组/矩阵保存子问题的解==。
  • 状态转移方程:
    ans(当前t时刻大问题) = ans(前一步t-1时刻小问题)+当前问题处理
    找到大问题与小问题之间的关联,则可以逐步推进得到最终问题的解。

3、动态规划方法介绍:
动态规划是付出额外的内存空间来节省时间,典型的时空平衡。
3.1、动态规划算法设计步骤:
在这里插入图片描述
最优子结构:问题的最优解由相关子问题的最优解组合而成,而这些子问题可以独立求解。

3.2、动态规划算法实现方法:
a)带备忘的自顶向下法:
按正常递归过程进行编写,但过程中保存每一个子问题的解。求解子问题时,先查找是否已保存过此解,是则返回,否则计算后保存返回。
钢条切割问题伪代码:
在这里插入图片描述
在这里插入图片描述

b)自底向上法(常用):
先解决最小规模子问题的解,然后问题逐步扩大,当扩大到待求解问题时,其前提子问题都求解完毕(将子问题按规模排序,按由小到大进行求解)。
由于没有频繁的递归调用开销,自底向上法的时间复杂度具有更小的系数。
钢条切割问题伪代码:
在这里插入图片描述
两层循环: 一层循环用于遍历小问题–>大问题;第二层用于求解该小问题。

c)完整代码:返回最优解的值r与最优解s:
在这里插入图片描述
在这里插入图片描述
参考资料: 算法导论359页,15章动态规划

总结:

1、动态规划用空间换时间,需要开辟一个数组用于保存子问题的解,避免子问题的重复计算。
2、动态规划用于求解最优化问题,常用自底向上方法(先求解子问题,再逐步扩大。从小问题到大问题,常利用for循环遍历)。

3、找到状态转移方程最重要

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值