动态规划算法入门
【摘要】
前言
说来惭愧,大学期间对算法并不是很重视,对算法的研究也就是大二获得过省级三等奖的蓝桥杯。但是没有对算法进行系统的刷题练习,所以有些类型的算法也没有接触到。可是一般稍微大一点的互联网科技公司都会要求掌握基本的算法。这其中一定包括动态规划算法,这种算法和其他算法还有一定的区别:题目类型多、没有固定模板、难度偏高。对于没有接触过的人很难有什么思路。所以我打算单独写一篇文章来记录DP算法。
动态规划
什么是动态规划?
给定一个矩形网格,一个机器人从左上角出发,每次可以向下或向右走一步。
题A:求有多少种方式走到右下角。
题B:输出所有走到右下角的路径。
动态规划题目特点
计数
有多少种方式走到右下角
有多少种方式选出k个数使得和是Sum
求最大值最小值
从左上角走到右下角路径的最大数字和
最长上升子序列长度
求存在性
取石子游戏,先手是否必胜
能不能选出k个数使得和是Sum
牛刀小试
换硬币问题
题目描述
1 | 给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 -1. |
1 | 样例1 |
动态规划组成部分
动态规划组成部分一:确定状态
状态在动态规划中的作用属于定海神针
简单的说,解动态规划的时候需要开一个数组,数组的每个元素
f[i]
或者f[i][j]
代表什么?——类似于解数学题中,X,Y,Z代表什么?确定状态需要两个意识:
- 最后一步
- 子问题
最后一步
动态规划组成部分二:
动态规划组成部分三:
动态规划组成部分四:
小结
- 求最值型动态规划
- 动态规划组成部分
- 确定状态
- 最后一步(最优策略中使用的最后一枚硬币ak)
- 化为子问题(最少的硬币拼出更小的面值27-ak)
- 转移方程
- f[X] = min{f[X-2]+1,f[X-5]+1,f[X-7]+1}
- 初始条件和边界情况
- f[0] = 0,如果不能拼出Y,f[X]=正无穷
- 计算顺序
- f[0],f[1],f[2]……
- 确定状态
- 消除冗余,加速计算
不同的路径
1 | 有一个机器人的位于一个 m × n 个网格左上角。 |
1 | 样例 |
跳跃游戏
1 | 给出一个非负整数数组,你最初定位在数组的第一个位置。 |
1 | 样例 1 |
乘积最大子序列问题
1 | 找出一个序列中乘积最大的连续子序列(至少包含一个数)。 |
1 | 样例 1: |
结束语
bye~