2.0 KiB
2.0 KiB
基础问题
509. 斐波那契数
dp[i]
是第i
个斐波那契数的数值dp[i] = dp[i - 1] + dp[i - 2]
dp[0] = 0
,dp[1] = 1
- 从前向后遍历
70. 爬楼梯
dp[i]
是爬到第i
阶楼梯的方法数dp[i] = dp[i - 1] + dp[i - 2]
dp[1] = 1
,dp[2] = 2
,dp[0]
不用管- 从前向后遍历
746. 使用最小花费爬楼梯
dp[i]
是爬到第i
阶的最小开销(假设i == 0
代表第一个阶梯)dp[i] = min{dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]}
dp[0] = 0
,dp[1] = 0
- 从前向后遍历
62. 不同路径
dp[i][j]
表示到(i, j)
的位置有多少种路径(从(0, 0)
出发)dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
dp[i][0] = 1
,dp[0][j] = 1
- 从前向后遍历
63. 不同路径 II
dp[i][j]
表示到(i, j)
的位置有多少种路径(从(0, 0)
出发)dp[i][j] = if (isNotObstacle[i - 1][j]) dp[i - 1][j] + if (isNotObstacle[i][j - 1]) dp[i][j - 1]
- 如果
(i, 0)
是障碍物,那么(0, 0)
到(i - 1, 0)
都初始化为1
,后面的初始化为0
。(0, j)
同理 - 从前向后遍历
343. 整数拆分
dp[i]
为分拆数字i
,可以得到的最大乘积dp[i] = max{dp[i], (i - j) * j, dp[i - j] * j}
dp[2] = 1
- 从前向后遍历
96. 不同的二叉搜索树
dp[i]
为n == i
时二叉搜索树的个数dp[i] += dp[j - 1] * dp[i - j]
,j - 1
为j
为头结点左子树节点数量,i - j
为以j
为头结点右子树节点数量dp[0] = 1
空节点也是一棵二叉树,也是一棵二叉搜索树- 从前向后遍历
找规律