题目链接:● 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];
}
}
总结:
昨天晚上过了一遍单词;
今日打卡完成;
上午上了软件工程的课;
又学了一些计组,哎,还要补考啊;
一会完成一下作业;