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

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

代码随想录

视频讲解:动态规划,本题关键在于理解递推公式!| LeetCode:343. 整数拆分_哔哩哔哩_bilibili

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

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

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.不同的二叉搜索树

代码随想录

视频讲解:动态规划找到子状态之间的关系很重要!| LeetCode:96.不同的二叉搜索树_哔哩哔哩_bilibili

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

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];
    }
}

总结:

昨天晚上过了一遍单词;

今日打卡完成;

上午上了软件工程的课;

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

一会完成一下作业;

你可能感兴趣的:(代码随想录算法训练营,算法,矩阵,leetcode)