Day34 | Part3
约 396 个字 27 行代码 预计阅读时间 2 分钟
343.整数拆分
- dp[i]: 拆分数字, 可以得到最大的乘积为dp[i]
-
得到dp[i], 从1遍历j, 一是
j * (i - j)
,二是j * dp[i - j]
dp[i] = max(dp[i], max( (i - j) * j, dp[i -j] * j))
-
初始化: dp[2] = 1
- 从前向后进行遍历
- 举例n = 10, 如图
1 2 3 4 5 6 7 8 9 10 11 |
|
也可以贪心,每次拆成n个3,如果剩下是4,则保留4,然后相乘
1 2 3 4 5 6 7 8 9 |
|
96.不同的二叉搜索树
dp[3],即1为头结点搜索树的数量 + 2为头结点搜索树的数量 + 3为头结点搜索树的数量
- 1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量
- 2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量
- 3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量
即dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]
如图
- dp[i]: 1到i为节点组成的二叉搜索树的个数为dp[i]
-
dp[i] += dp[以j为头结点左子树节点数量] * dp[以j为头结点右子树节点数量]
- j相当于是头结点的元素,从1遍历到i为止
-
dp[i] += dp[j - 1] * dp[i - j];
- j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量
-
初始化dp[0] = 1
- 从前到后遍历, i→n, j→i
- 举例n=5 → 如图
1 2 3 4 5 6 7 |
|