LeetCode动态规划之卡特兰数

299 阅读1分钟

image.png 分析: 二叉搜索树即左子树均小于根节点,右子树均大于根节点(中序遍历后为有序列表) 假设G(n)代表n个节点组成的二叉搜索数的结果,我们设根节点为i的节点有f(i)中二叉树则有

G(n)=f(1)+f(2)+...+f(i)+...+f(n)

对于f(i)=i-1组成的左子树* n-i组成的右子树,左右子树相互独立不影响直接相乘,即

f(i) = G(i-1)*G(n-i)

两个公式结合,得出状态方程

G(n)=G(0)*G(n-1) + ... + G(i-1)*G(n-i) + ... + G(n-1)(0)

满足上述公式的即为卡特兰数 贴出代码:

    public static int numTrees(int n) {
        int[] dp = new int[n+1];
        dp[0]=0;
        dp[1]=1;
        for (int i = 2; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                dp[i] += dp[j - 1] * dp[i - j];
            }
        }
        return dp[n];
    }