zoukankan      html  css  js  c++  java
  • 96. Unique Binary Search Trees

    稍微有那么点意思了,用的DP。

    修修改改,居然做出来了。
    思路就是N的时候
    分别以1,2,3,4...n为ROOT
    左边分别有
    n-1,n-2...0
    0,1,2,3...n-1

    DP[n]表示n有几种可能:
    0表示null,就1种可能
    1也只有1种可能。

    所以就是dp左边*dp右边

    public class Solution {
        public int numTrees(int n) {
            if(n == 0) return 1;
            if(n == 1) return 1;
            
            int[] dp = new int[n+1];
            dp[0] = 1;
            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];
                    //System.out.println(dp[i]);
                }
            }
            
            return dp[n];
        }
    }
    

    好开心啊。。自己做出来了~~



    我一刷是怎么做出来的。。。

    比如N=5的时候,我们可以以1 2 3 4 5作为ROOT。
    假设以3作为ROOT,左边有2种可能,右边有2种可能,最后就是4种可能。
    以2为ROOT的话,左边有1种可能,右边是(345)组成的二叉树的可能。

    这么看来是动态规划。

    n = 5 就是以12345为ROOT的所有可能性加起来。。

    每种可能性里,左右的可能性要相乘。

    public class Solution {
        public int numTrees(int n) {
            if (n == 0) return 1;
            
            int[] dp = new int[n+1];
            dp[0] = 1;
            dp[1] = 1;
            
            for (int i = 2; i <= n; i++) {
                for (int j = 1; j <= i; j++) {
                    dp[i] += dp[i - j] * dp[j - 1];
                }
            }
            
            return dp[n];
        }
    }
    
  • 相关阅读:
    hdu4135(容斥原理求质数,队列实现)
    poj2559(单调栈)
    poj2796(单调栈)
    icpc2018焦作Transport Ship(背包思想)
    icpc2018焦作Mathematical Curse(动态规划)
    2018icpc徐州OnlineA Hard to prepare
    icpc2018徐州OnlineG-Trace(线段树)
    hdu3499(分层图最短路 or 反向建图)
    MINE
    数论(Mathmatics)总结[1]
  • 原文地址:https://www.cnblogs.com/reboot329/p/6112106.html
Copyright © 2011-2022 走看看