343. 整数拆分
要求:给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。
思路
dp[i]表示i能拆分的最大乘积,i能拆分成j(i-j),或者j * dp[i-j]
递推公式为 dp[i] = max(dp[i], j * (i-j), j * dp[i-j])
初始化dp[0]=dp[1]=0 dp[2]=1
var integerBreak = function(n) {
let dp = new Array(n+1).fill(0)
dp[0] = 0, dp[1] = 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. 不同的二叉搜索树
要求:给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
思路
头节点1 + 头节点2 + 头节点3
- 头节点1 = 左子树0节点 * 右子树2节点
- 头节点2 = 左子树1节点 * 右子树1节点
- 头节点3 = 左子树2节点 * 右子树0节点
dp[0] = 1
递推公式 dp[i] += dp[j-1] * dp[i-j]
var numTrees = function(n) {
let dp = new Array(n+1).fill(0)
dp[0] = 1
for(let i=1; i<=n; i++){
for(let j=1; j<=i; j++){
dp[i] += dp[j-1]*dp[i-j]
}
}
return dp[n]
};