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  |  |