树上求和
涉及知识点:
- 动态规划
solution:
- 设G(n): 长度为 n 的序列能构成的不同二叉搜索树的个数。
- 设F(i, n): 以 i 为根、序列长度为 n 的不同二叉搜索树个数。
- 那么所有得情况总和(G(n) = sum_{i=1}^n F(i,n))
- 边界情况为G(0) = G(1) = 1
- 那么F(i,n) = G(i-1) * G(n-i)
- 将式子进行带入得到(G(n) = sum{i=1}^n F(i-1) cdot G(n-i))
std:
class Solution {
public:
int numTrees(int n) {
vector<int> v(n+1,0);
v[0] = 1;
v[1] = 1;
for (int i = 2; i <= n ; i ++ )
{
for (int j = 1; j <= i ; j ++ )
{
v[i] += v[j-1] * v[i-j];
}
}
return v[n];
}
};