基础
动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题,使用动态规划是最有效的。
对于动态规划问题,我将拆解为如下五步曲,这五步都搞清楚了,才能说把动态规划真的掌握了!
- 确定dp数组(dp table)以及下标的含义
- 确定递推公式
- dp数组如何初始化
- 确定遍历顺序
- 举例推导dp数组 (主要是debug)
刷题
- 斐波那契数列
- 确定dp数组,dp[i]的含义:第i个斐波那契数
- 确定递推公式:dp[i] = dp[i-1] + dp[i-2]
- 确定dp数组初始化:dp[0] = 1, dp[1] = 1
- 确定遍历顺序:从前往后
- 打印dp数组
- 爬楼梯
- 确定dp数组,dp[i]含义:爬到第i阶楼梯
- 确定递推公式:dp[i]=dp[i-1]+dp[i-2]. 难点
- 确定dp数组初始化:dp[0]没有意义,dp[1] = 1, dp[2] = 2
- 确定遍历顺序: 从前往后
- 打印dp数组
- 使用最小花费爬楼梯
- 确定dp数组,dp[i]含义: 爬到第i阶楼梯需要的的花费+本阶楼梯的花费,最后一阶的本阶楼梯花费为0
- 确定递推公式: dp[i] = min(dp[i-1], dp[i-2]) + cost[i]
- 确定dp数组的初始化:dp[0] = cost[0], dp[1] = cost[1]
- 确定遍历顺序: 从前往后
- 打印dp数组