代码随想录算法训练营第40天| 动态规划

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)的时候,也算一种情况;

最关键点还是要知道,从哪些角度去寻找规律,怎么去切入
比如下图
n为1的时候有一棵树,n为2有两棵树,这个是很直观的。

在这里插入图片描述
应该从左右子树的节点数量上去区分不同情况:
得到
元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量

元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量

元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值