7.20每日一题题解

树上求和

涉及知识点:

  • 动态规划

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];
    }
};
原文地址:https://www.cnblogs.com/QFNU-ACM/p/13346296.html