整数拆分的思路就是对给定整数i, 以j遍历,乘积最大值为dp[j] * (i-j) 或者 (i-j) * j,取最大值即可。 对于每个dp[i]的计算都要遍历从1到i,但超过 i/2就不可能有更好的结果,所以也可以只遍历到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/2; j++) {
dp[i] = Math.max(dp[i], Math.max(dp[i-j] * j, (i-j) * j));
}
}
return dp[n];
}
}
96. Unique Binary Search Trees 二叉搜索树的唯一结构数。 子问题就是如果已经有dp[i-1],即i-1个元素的二叉搜索树集合,如何推dp[i] 可以用根节点为j来遍历。根节点为j时,左子树有j-1个元素,右子树有i-j个元素,所以根节点为j的BST数目为dp[j-1] * dp[i-j]。 将j从1遍历到i, dp[i]即为所有的遍历数之和。
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];
}
}