代码随想录算法训练营第四十一天 | ● 343. 整数拆分 ● 96.不同的二叉搜索树

题目链接:● 343. 整数拆分

代码随想录

看完代码随想录之后的想法:

我们要知道动态规划的五部曲;

1,确定dp数组的含义,下标的含义;

2,确定递推公式;

3,确定dp数组如何初始化;

4,确定遍历顺序;

5,打印dp数组(用来debug)

我们把一个数差分的时候,先拆成两个数,计算它的大小,然后在拆分其中的一个值,然后用没有拆分的值乘上拆分的值得最大成绩;然后和原来的dp[i]比最大,最大的就是dp[i]的值;

class Solution {
    public int integerBreak(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 0; dp[1] = 0; dp[2] = 1;
        for(int i = 3; i <= n; i++) {
            for(int j = 1; j < i; j++) {
                dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j]));
            }
        }
        return dp[n];
    }
}

题目链接:96.不同的二叉搜索树

代码随想录

看完代码随想录之后的想法:

dp[i] 的含义十是对于有i个节点,它的最多的树的数量为dp[i];

i个节点,从1到i都可以作为头节点,然后对于每一种情况

假设j为头节点,左子树有j-1个节点,右子树有i-j个节点

左子树树dp[j - 1] 乘上右子树的dp[i - j];就是以j为头节点的树的数量;

class Solution {
    public int numTrees(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 1;
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= i; j++)
                dp[i] += dp[j - 1] * dp[i - j];
        }
        return dp[n];
    }
}

总结:

昨天晚上过了一遍单词;

今日打卡完成;

上午上了软件工程的课;

又学了一些计组,哎,还要补考啊;

一会完成一下作业;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值