func integerBreak(n int) int {
if n < 2 {
return 0
} else if n == 2 {
return 1
}
// dp[i]数组的含义:对i拆分得到的最大的乘积
dp := make([]int, n+1) //注意这里为n+1 dp[10]为第11个元素
//dp数组初始化
dp[0], dp[1], dp[2] = 0, 0, 1
//遍历顺序为从前到后
for i := 3; i < n+1; i++ {
for j := 1; j < i; j++ {
//递推公式(拆成两个数、三数及以上)
dp[i] = Max(dp[i], Max(j*(i-j), dp[i-j]*j))
}
}
return dp[n]
}
func Max(i, j int) int {
if i > j {
return i
}
return j
}
func numTrees(n int) int {
// dp[i]表示给定整数i可以构成的二叉搜索树的种类
dp := make([]int, n+1)
//初始化dp[i]
dp[0] = 1
//遍历顺序从左往右
for i := 1; i <= n; i++ {
for j := 1; j <= i; j++ {
//递推公式,j为头结点,左子树一定有j-1个结点,右子树一定有i-j个结点
dp[i] += dp[j-1] * dp[i-j]
}
}
return dp[n]
}