343. 整数拆分+
给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
思路:
本题难点在第2步,如何得到递推公式
题目关键词:正整数, k >= 2,成绩最大化
到底将n拆成几个数呢?? 两种情况:两个或多个
dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。
可以想 dp[i]最大乘积是怎么得到的呢?
答:其实可以从1遍历j,然后有两种渠道得到dp[i].
1.一个是j * (i - j) 直接相乘。(拆成两个数)
/*拆分举例子:*/
设i=6;
dp[i]=1x5;
2x4;
3x3;
4x2;
5x1;
取最大的就好
2.一个是jx dp[i - j],相当于是拆分(i - j) (拆成3个或3 个以上)
思考为什么上面j要固定呢而不是dp[j]xdp[i - j]?
因为如果用这种方式的话dp[j]其实至少是2个数及以上,就得不拆成3个数的情况了. dp[j]这个结果,不管它是由多少个整数组成的,只要是最大的,就可以
就是假设i=10,j=1;
dp[10]=1xdp[9] (也就是说就取最多的)
dp[10]=2xdp[8]
......
for (int i = 3; i <= n ; i++) {
for (int j = 1; j < i - 1; j++) {
dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j));
}
}
96.不同的二叉搜索树
注意当子树为nll(子树树木为0)的时候,也算一种情况;
最关键点还是要知道,从哪些角度去寻找规律,怎么去切入
比如下图
应该从左右子树的节点数量上去区分不同情况:
得到
元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量
元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量
元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量