Leetcode 96 不同的二叉搜索树
/**动态规划
* 状态定义:
* DP[n]表示1~n个节点构成的二叉搜索树总数, 等于以i (1<=i<=n)为根节点的二叉搜索树数量之和
* 状态递推:
* 根节点i左侧由 i-1 个节点构成,数量为 DP[i-1]; 右侧由 n-i 个节点构成,数量为DP[n-i]
* 因此以i为根节点的二叉搜索树总数为 DP[i-1]*DP[n-i]
* 即 DP[n] = DP[0]*DP[n-1] + ... + DP[n-1]*DP[n]
* 初始状态:
* DP[0] = 1(空树); DP[1] = 1(一个根节点); DP[2] = DP[0]*DP[1] + DP[1]*DP[0]; ...
* */
class Solution {
public int numTrees(int n) {
//状态定义及初始状态
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 1;
//状态递推
//dp[n] = dp[0]*dp[n-1] + dp[1]*dp[n-2] + ... + dp[n-2]*dp[1] + dp[n-1]*dp[0]
//dp[n-1] -> dp[n]
for(int end=2; end<=n; end++){
for(int root=1; root<=end; root++){
dp[end] += dp[root-1]*dp[end-root];
}
}
//返回值
return dp[n];
}
}