一、343 整数拆分
1. 题目链接:力扣
2. 思路:dp数组的含义:dp[i]指的是拆分数字i能得到的最大乘积。可以从1到j开始遍历,将i-j进行拆分或者不拆分的分类,因此递推公式就是dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j)),而且需要将dp[i]也纳入最大值的考量范围,因为每次多遍历一个j的时候就需要和以前的dp[i]作比较求最大的。从2开始初始化,即dp[2] = 1。
3. 代码:
var integerBreak = function(n) {
var dp = new Array(n + 1).fill(0);
dp[2] = 1;
for (let i=3; i<=n; i++) {
for (let j=1; j<i; j++) {
dp[i] = Math.max(dp[i], j * (i - j), j * dp[i - j]);
}
}
return dp[n];
};
二、96 不同的二叉搜索树
1. 题目链接:力扣
2. 思路:以3为例,分别以1/2/3为根节点,左边一个右边一个,左边两个右边没有,以及左边没有右边两个,这些子树的形状和之前的dp[i]是一样的
3. 代码:
var numTrees = function(n) {
var dp = new Array(n + 1).fill(0);
dp[0] = 1;
dp[1] = 1;
//dp[3] = dp[0]*dp[2] + dp[1]*dp[1] + dp[2]*dp[0]
// 分别代表以0/1/2为根节点的树的个数
for (let i=2; i<=n; i++) {
for (let j=0; j<=i-1; j++) {
dp[i] += dp[j]*dp[i-1-j];
}
}
return dp[n];
};
今日学习时长:1.5h左右
总结:不太容易想到啊。。。只能多看多做?