动态规划(Dynamic Programming,简称DP)

动态规划是运筹学的一个分支,通常用来解决多阶段决策过程最优化问题。动态规划的基本想法就是将原问题转换为一系列相互联系的的子问题,然后通过逐层递推来求得最后的解。目前,动态规划常常出现在各类计算机算法竞赛(例如ACM,蓝桥杯)或者程序员笔试面试中,在数学建模比赛中出现的较少,但这个算法的思想在生活中非常实用,学完本节后对你解决实际问题的思维方式一定很有启发。
在这里插入图片描述
动态规划(Dynamic Programming,DP)是运筹学的一个分支,通常用来求解决策过程最优化问题。
本节我们将主要以例题的形式来进行讲解,通过例题来带大家体会动态规划这种方法的思想,并建立起求解动态规划问题的框架。
本节涉及到的例题如下:

  • 斐波那契数列
  • 打家劫舍(力扣198)
  • 礼物的最大价值(剑指 Offer 47
  • 零钱兑换(力扣 322)
  • 01背包问题(01 Knapsack problem)
  • 求硬币兑换的方案数(国赛1992 年真题:实验数据分解)

最后,我也留了几道课后习题并提供了相应的参考答案供大家练习。

在这里插入图片描述
动态规划是用来解决最优问题(也可以用来求方案数)的一种方法,或者说是一种思想。而解决问题的过程,需要经历多个阶段,每一阶段都可以看成一个子问题,每个子问题都对应着一组状态。
使用动态规划一般会经历四个步骤:
(1)定义原问题和子问题。子问题是和原问题相似但规模较小的问题。
(2)定义状态。这里的状态大家可以认为就是某个函数的自变量,根据状态中包含的参数个数的不同,我们在编程时设置的DP数组的维度就不同。每个状态中的参数通常都能对应DP数组中某个元素的下标,而DP数组的元素就是这个状态对应的子问题的求解结果。
(3)寻找状态转移方程。这一步往往是最难的,大家需要找到关于状态之间的某种转移关系,这个关系往往是一个递推式子,根据这个递推式我们才能一步一步计算出DP数组里面的元素。另外别忘了确定边界条件,也就是我们递推的初始条件。另外,如果一个问题能用动态规划方法求解,需要满足最优子结构和无后效性,我在讲解例题时回避掉了这一点,但这不代表它们并不重要,因为这一块的严格证明非常困难,后续如果你有兴趣可以学习专门的算法课程。
(4)编程实现。如果前三步大家逻辑都理顺了,那么编程不是大的问题。我们无非就是先初始化一个DP数组,再结合边界条件计算DP数组中的初始值,最后再利用循环来对DP数组进行迭代。一般DP数组中最后那个元素就是我们要解决的原问题的答案。
最后,动态规划问题需要多练,我这一讲涉及到的问题不算困难,只起到抛砖引玉的作用。大家真的对算法这一块感兴趣的话可以去B站搜索“数据结构”或者“算法”这种关键词,能学到很多计算机科班同学的课程。尽管在数模比赛中动态规划很少用到,但我相信大家学完这一节后思维一定很有启发,有兴趣的同学可以在“力扣”网站上面找到更多关于动态规划的练习题。

**

视频链接:动态规划课程

**

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值