343.整数拆分
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++) { // 从3开始循环,因为dp[2]已经被初始化
for (int j = 1; j <= i / 2; j++) { // 只需要循环到i的一半即可
// 比较dp[i]、j*(i-j)和j*dp[i-j]三者之间的最大值
dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j]));
}
}
return dp[n]; // 返回dp[n],而不是dp[n+1]
}
}
96.不同的二叉搜索树
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++){ //i 为总节点个数
for(int j = 0; j <= i-1;j++){ //j为左子树节点个数
dp[i] += dp[j]*dp[i-1-j];
}
}
return dp[n];
}
}