- 题目描述:
- 给定整数n,计算存储序列为1...n的结构唯一的BST的个数
- 题目来源:
- http://oj.leetcode.com/problems/unique-binary-search-trees/
- 题目分析:
- 对于一个表示序列为1...n的BST,根元素可以是1到n中的任何一个数,当根元素为 i 时,左子树为表示1...i - 1的BST,右子树为表示i + 1...n的BST,所以,原问题可以通过子问题的解得到
- 定义状态f(i,j),状态f(i,j)为表示序列i...j的结构唯一的BST的个数,通过枚举根的值可以得到:
- f(i,j) = sum(f(i,k - 1) * f(k + 1, j))(i <= k <= j)
- 时间复杂度:O(n^3)
- 示例代码:
int dp[100][100];
int numTrees(int n) {
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; ++i)
dp[i][i - 1] = dp[i + 1][i] = 1;
for(int len = 1; len <= n; ++len) {
for(int i = 1; i <= n - len + 1; ++i) {
for(int k = i; k <= i + len - 1; ++k) {
dp[i][i + len - 1] += dp[i][k - 1] * dp[k + 1][i + len - 1];
}
}
}
return dp[1][n];
}