📜  给定密钥的唯一 BST 数量 |动态规划

📅  最后修改于: 2021-09-22 09:52:07             🧑  作者: Mango

给定 N,找出可以使用 1 到 N 之间的值制作的唯一 BST 的总数。

例子:

Input: n = 3 
Output: 5
For n = 3, preorder traversal of Unique BSTs are:
1. 1 2 3
2. 1 3 2
3. 2 1 3
4. 3 1 2
5. 3 2 1

Input: 4 
Output: 14

在上一篇文章中,我们讨论了一个 O(n) 解决方案。在这篇文章中,我们将讨论基于动态规划的解决方案。对于 i 的所有可能值,将 i 视为根,那么 [1….i-1] 个数字将落在左子树中,而 [i+1….n] 个数字将落在右子树中。因此,将 (i-1)*(ni) 添加到答案中。乘积的总和将是唯一 BST 数量的答案。

以下是上述方法的实现:

C++
// C++ code to find number of unique BSTs
// Dynamic Programming solution
#include 
using namespace std;
  
// Function to find number of unique BST
int numberOfBST(int n)
{
  
    // DP to store the number of unique BST with key i
    int dp[n + 1];
    fill_n(dp, n + 1, 0);
  
    // Base case
    dp[0] = 1;
    dp[1] = 1;
  
    // fill the dp table in top-down approach.
    for (int i = 2; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
  
            // n-i in right * i-1 in left
            dp[i] = dp[i] + (dp[i - j] * dp[j - 1]);
        }
    }
  
    return dp[n];
}
  
// Driver Code
int main()
{
    int n = 3;
    cout << "Number of structurally Unique BST with " << 
    n << " keys are : " << numberOfBST(n) << "\n";
  
    return 0;
}


Java
// Java code to find number
// of unique BSTs Dynamic 
// Programming solution
import java.io.*;
import java.util.Arrays;
  
class GFG
{
    static int numberOfBST(int n)
    {
  
    // DP to store the number 
    // of unique BST with key i
    int dp[] = new int[n + 1];
    Arrays.fill(dp, 0);
  
    // Base case
    dp[0] = 1;
    dp[1] = 1;
  
    // fill the dp table in
    // top-down approach.
    for (int i = 2; i <= n; i++) 
    {
        for (int j = 1; j <= i; j++) 
        {
  
            // n-i in right * i-1 in left
            dp[i] = dp[i] + (dp[i - j] * 
                             dp[j - 1]);
        }
    }
  
    return dp[n];
}
  
// Driver Code
public static void main (String[] args) 
{
    int n = 3;
    System.out.println("Number of structurally " + 
                           "Unique BST with "+ n +
                                  " keys are : " + 
                                  numberOfBST(n));
}
}
  
// This code is contributed
// by shiv_bhakt.


Python3
# Python3 code to find number of unique 
# BSTs Dynamic Programming solution 
  
# Function to find number of unique BST 
def numberOfBST(n): 
  
    # DP to store the number of unique
    # BST with key i 
    dp = [0] * (n + 1) 
  
    # Base case 
    dp[0], dp[1] = 1, 1
  
    # fill the dp table in top-down 
    # approach. 
    for i in range(2, n + 1): 
        for j in range(1, i + 1): 
  
            # n-i in right * i-1 in left 
            dp[i] = dp[i] + (dp[i - j] *
                             dp[j - 1]) 
  
    return dp[n] 
  
# Driver Code 
if __name__ == "__main__": 
  
    n = 3
    print("Number of structurally Unique BST with", 
                   n, "keys are :", numberOfBST(n)) 
  
# This code is contributed 
# by Rituraj Jain


C#
// C# code to find number
// of unique BSTs Dynamic 
// Programming solution
using System;
  
class GFG
{
    static int numberOfBST(int n)
    {
  
    // DP to store the number 
    // of unique BST with key i
    int []dp = new int[n + 1];
      
    // Base case
    dp[0] = 1;
    dp[1] = 1;
  
    // fill the dp table in
    // top-down approach.
    for (int i = 2; i <= n; i++) 
    {
        for (int j = 1; j <= i; j++) 
        {
  
            // n-i in right * i-1 in left
            dp[i] = dp[i] + (dp[i - j] * 
                             dp[j - 1]);
        }
    }
    return dp[n];
}
  
// Driver Code
public static void Main () 
{
    int n = 3;
    Console.Write("Number of structurally " + 
                      "Unique BST with "+ n +
                             " keys are : " + 
                             numberOfBST(n));
}
}
  
// This code is contributed
// by shiv_bhakt.


PHP


输出:
Number of structurally Unique BST with 3 keys are : 5

时间复杂度: O(n 2 )

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程