动态规划算法
科技公司面试必备算法
题目类型多,没有固定模板
难度属于中上
动态规划题目
机器人从左上角走到右下角,每次向右或者向下走一步
问题1:求有多少种走法? -> 动态规划
问题2:输出所有走法的路径? -> 递归
问题1一般用动态规划求解,而问题2一般用递归来解决。
如何判断该题为动态规划?
- 计数题
- 有多少种走到右下角的方法
- 有多少种方法选出K个数使得和是sum
- 求最大最小值
- 从左下角走到右上角的最大数字和
- 最长上升子序列长度
- 求存在性
- 取石子游戏,先手是否必胜
- 能不能选出K个数使得和是sum
案例
你有三种硬币,分别面值2元,5元,7元,每种硬币都足够多
买一本书需要27元,如何用最少的硬币组合正好付清,不需要找钱?
步骤一:确定状态
状态在动态规划中作用属于定海神针,简单来说动态规划问题都需要一个数组,数组的每个元素,类似于数学题的未知数x,y,z
所以首先要确定状态,首先先确定一下最后一步的决策
该题中,最后一枚硬币一定是 ak,除去最后这个硬币,前面的硬币面值加起来是27-ak
关键点1:我们不关心前面k-1枚硬币是如何拼凑出27-ak的,我们不知道ak和k是多少,但是我们确定前面的硬币拼出了27-ak
关键点2:因为是最优策略,所以拼出27-ak的硬币数一定要最少,否则这就不是最优策略
到这里我们就将问题变成了一个子问题,如何用最少的硬币拼出27-ak
为了简化定义,我们设状态f(x) = 最少用多少枚硬币拼出X
总结出来,如下图
步骤二:转移方程
设状态f[x]=最少用多少枚硬币拼出X
对于任意一个X
f[X] = min{f[X-2]+1,f[X-5]+1,f[X-7]+1}
步骤三:初始条件和边界情况
X-2.X-5.X-7小于0怎么办,什么时候停下来
如果不能拼出Y,就定义f[Y] = 正无穷
初始条件: f[0] = 0
步骤四:计算顺序
从左往右,因为要计算f[X]时,前边的f[X-2]什么什么的都已经计算过了