基础
思路分为5个步骤:
- 确定dp数组以及下标的含义
- 确定递推公式
- dp数组的初始化
- 确定遍历顺序
- 举例推导dp数组
509. 斐波那契数
dp[i]
的含义为:第i个数的斐波那契数值是dp[i]
dp[i]=dp[i-1]+dp[i-2]
,前两个数之和为第三个数dp[0]=1,dp[1]=1
- 遍历顺序:从前向后,后面的数依赖前面的数
0 1 1 2 3 5
70. 爬楼梯
- 分析:第三层楼梯取决于第一层楼梯和第二层楼梯,说明它们之间有重叠子问题
dp[i]
的含义为:爬到第i
层楼梯,有dp[i]
种方法- 递推公式:
dp[i]=dp[i-1]+dp[i-2]
- 数组初始化:
dp[1]=1,dp[2]=2
- 遍历顺序:从前向后
746. 使用最小花费爬楼梯
- 分析:站在下标0和下标1的阶梯,开始爬楼梯是不花费体力的
dp[i]
的含义:到达第i台阶所花费的最少体力为dp[i]
- 递推公式:
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2])
- 数组初始化:
dp[0]=0,dp[0]=0
,因为在第一台和第二台阶梯是不花费体力的 - 遍历顺序:从前向后
62.不同路径
- 分析:方向只能向右或者向下到达终点,不能回头
dp[i]
的含义为:表示从(0,0)
出发到(i,j)
有dp[i][j]
条不同的路径- 递推公式:
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
,只有这两个方向的路径 - 数组初始化:第一行和第一列都初始化为1
- 遍历顺序:从左至右一层一层遍历
63.不同路径||
- 分析:有了障碍表示要加上约束条件
dp[i]
含义为:从(0,0)
出发到(i,j)
有dp[i][j]
条不同的路径- 递推公式同62一样
- 数组初始化:同样都是第一行和第一列都为1,但如果后面有了障碍,后面的数值都是0,要加上限定条件
- 遍历顺序:从左至右一层一层遍历,如果有障碍,就跳过,重新遍历
343. 整数拆分
dp[i]
的含义为:分拆数字i
,得到的最大乘积为dp[i]
- 递推公式:
dp[i] = max({dp[i], (i - j) * j, dp[i - j] * j})
- 数组初始化:
dp[0]=0,dp[0]=0,dp[1]=1
- 遍历顺序:从前向后遍历