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];
    }
};
posted @ 2020-07-20 17:31  QFNU-ACM  阅读(82)  评论(0编辑  收藏  举报