动态规划学习笔记
算法了解
什么是动态规划
动态规划(英语:Dynamic programming,简称DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
动态规划常常适用于有重叠子问题和最优子结构性质的问题,动态规划方法所耗时间往往远少于朴素解法。
动态规划背后的基本思想非常简单。大致上,若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。
通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。
— 摘自维基百科
动态规划基本思想
动态规划主要的思想有以下几点:
- 将复杂问题拆分为一个个子问题,再由子问题推算出原问题
- 将重复使用的量记录下来(类似于记忆化)
一个例题了解动态规划
动态规划五部曲
很多人“学会”了动态规划就是背过代码,照葫芦画瓢。一遇到变形题就不会了,所以,想要真正掌握动规,需要掌握动态规划五部曲才行:
- 定义状态(即确定f数组的含义)
- 确认状态转移方程(即递推式)
- 初始化f数组
- 确认循环顺序
- 举例推导验证
例题解析
来看一道例题:P1216 数字三角形
我们按照动态规划五部曲解决此题。
定义状态
这道题定义状态没什么难度,定义 f [ i ] [ j ] f[i][j] f[i][j]为从第i行第j个数到最后一行的最大价值。
确认状态转移方程
首先思考: