将整数拆分为多个数,并求出其乘积最大的值。将值从1到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( j*(i-j),j*dp[i-j]));
}
}
return dp[n];
}
}
判断多个节点能构成的二叉树的数量。根据卡特兰数可得递推公式h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n≥2),(这个公式的下标是从h(0)=1开始的)
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];
}
}
总结:第一题有些难,很难想出最大数的递推公式;第二题可以查公式。