题目1: 343. 整数拆分
1- 思路
- 1. 确定dp数组及下标的含义
dp[i]
代表的含义是 以 i
为头结点的 BST 的种类数- 此时使用
j
进行枚举,
- 2. 递推公式
- 递推思路:根据二叉树的性质,以当前
i
为根节点,用 j
来 枚举
- 此时以 j 为根节点的左子树的个数为
j-1
,共有 dp[i-1]
个 BST 的分布方式 - 此时以 j 为根节点的右子树的个数为
i-j
,共有 dp[i-j]
个 BST 的分布方式 - 二者关系为相乘
dp[i-1]*dp[i-j]
- 注:此时用 j 遍历了所有,j 为头结点的关系情况,此时需要将 j 个结果相加才是最终的
dp[i]
- 因此
dp[i] += dp[i-1]*dp[i-j]
- 3. dp数组初始化
dp[0] = 1
为了使得左子树为空的情况,满足其乘右子树的种类保证结果不为 0
- 4. 确定遍历顺序
dp[i]
是通过小于 i
的状态推导而来的,因此需要从小到大去遍历
2- 题解
⭐ 整数拆分——题解思路
class Solution {
public int integerBreak(int n) {
int[] dp = new int[n+1];
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];
}
}
题目2: 96. 不同的二叉搜索树
1- 思路
- 1. 确定dp数组及下标的含义
dp[i]
代表的含义是 以 i
为头结点的 BST 的种类数- 此时使用
j
进行枚举,
- 2. 递推公式
- 递推思路:根据二叉树的性质,以当前
i
为根节点,用 j
来 枚举
- 此时以 j 为根节点的左子树的个数为
j-1
,共有 dp[i-1]
个 BST 的分布方式 - 此时以 j 为根节点的右子树的个数为
i-j
,共有 dp[i-j]
个 BST 的分布方式 - 二者关系为相乘
dp[i-1]*dp[i-j]
- 注:此时用 j 遍历了所有,j 为头结点的关系情况,此时需要将 j 个结果相加才是最终的
dp[i]
- 因此
dp[i] += dp[i-1]*dp[i-j]
- 3. dp数组初始化
dp[0] = 1
为了使得左子树为空的情况,满足其乘右子树的种类保证结果不为 0
- 4. 确定遍历顺序
dp[i]
是通过小于 i
的状态推导而来的,因此需要从小到大去遍历i
从 1
遍历到 n
j
从 1
遍历到i
2- 题解
⭐ 不同的二叉搜索树——题解思路
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];
}
}