LeetCode Unique Binary Search Trees--动态规划思想

来源:互联网 发布:mac一般用什么办公软件 编辑:程序博客网 时间:2024/06/08 18:00

题目:

Given n, how many structurally unique BST's (binary search trees) that store values 1...n?

For example,
Given n = 3, there are a total of 5 unique BST's.

   1         3     3      2      1    \       /     /      / \      \     3     2     1      1   3      2    /     /       \                 \   2     1         2                 3
看到这道题的时候,能够想到的是递归,在递归的过程中发现会有重复的子问题,所以应该考虑动态规划,动态规划需要定义一个状态数组来保存子问题的解,并且解是按照从小到大的顺序依次求得,与递归不同。

是一道典型的动态规划题目,因为有重叠的子问题,当前决策依赖于子问题的解 

设dp[i]表示共有i个节点时,能产生的BST树的个数 
n == 0 时,空树的个数必然为1,因此dp[0] = 1 
n == 1 时,只有1这个根节点,数量也为1,因此dp[1] = 1 
n == 2时,有两种构造方法,

因此,dp[2] = dp[0] * dp[1] + dp[1] * dp[0] 
n == 3时,构造方法如题目给的示例所示,dp[3] = dp[0] * dp[2] + dp[1] * dp[1] + dp[2] * dp[0] 
同时,求d[n]时,共有根节点元素为 1, 2, 3, 4, 5, ..., i, ..., n这n种情况,结果为n种情况的和,从小到大计算,基于以下原则的BST树具有唯一性: d[i] = d[0]*d[i-1]+d[1]*d[i-2]...+d[i-1]*d[0]

class Solution {public:    int numTrees(int n) {        if(n == 0)        return 1;        if(n == 1)        return 1;        int* num = new int[n+1];        num[0] = 1;        num[1] = 1;        for(int i=2;i<=n;i++) {            num[i] = 0;            for(int j=1;j<=i;j++) {                num[i] += num[j-1] * num[i-j];            }                    }        int res = num[n];        delete[] num;        return res;    }};




0 0