Day 41 | 动态规划 343. 整数拆分 、 96.不同的二叉搜索树
343. 整数拆分
题目
文章讲解
视频讲解
思路:不需要考虑正整数为1的情况。 dp[i]表示正整数i拆分后结果的最大乘积,递推公式中 j 表示拆分的正整数,最大不会超过 i-j ,否则会轮回。dp[i-j]是正整数 i-j 拆分后结果最大乘积。
class Solution {
public int integerBreak(int n) {
int[] dp = new int[n + 1];
// dp[i]表示正整数i拆分后结果的最大乘积
dp[2] = 1;
for (int i = 3; i <= n; i++) {
for (int j = 1; j <= i - j; j++) {
dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j]));
}
}
return dp[n];
}
}
96.不同的二叉搜索树
题目
文章讲解
视频讲解
思路:i 个节点,根节点 j ,左子树节点数 j-1 ,右子树节点数 i-j
class Solution {
public int numTrees(int n) {
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
}
}