整数拆分:
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;j++){
dp[i] = Math.max(dp[i],Math.max(j*dp[i-j],j*(i-j)));
}
}//这里感觉要注意的就是j是我们要拆分的数,所以不会是dp[j]*dp[i-j],这种情况在代码的进行中会进行
//因为j是从小到大进行的,拆分j的情况已经计算过了
//感觉智商有点不够
//从定义上来理解吧:j*dp[i-j]是将一个数拆分成两个及两个数以上,而dp[i-j]*dp[j]是将一个数默认拆分成四个数以上
//前一种情况包括后一种,好像懂了
return dp[n];
}
}
class Solution {
public int numTrees(int n) {
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] =1;//因为n的取值问题,所以不能写dp[2]
for(int i = 2;i<=n;i++){
for(int j =1;j<=i;j++){
///dp[j-1]代表以j为头节点的左子树的最大二叉搜索树
//dp[i-j]就是比j大的数,i是总数
dp[i] += dp[j-1]*dp[i-j];
}
}
return dp[n];
}
}