96.ユニークな二分探索木
中
与えられた nは、どのように多くの構造的にユニークなBSTの(二分探索木)その店は... 1値 のn?
例:
入力:3 出力:5 説明: 与えられたN = 3は、5つのユニークなBSTの合計がある: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3
三つの方法で解決この問題:
1.C ++バージョンDPの
間違い:
* +私は大きな問題をmisused.Causeこの部分
DP [I] + = DP [J] * DP [I - 1 - J]。
する#include <stdio.hに> する#include <iostreamの> する#include < ストリング > の#include < 文字列・H> の#include <ベクトル> の#include < セット > の#include <地図> の#include <アルゴリズム> の#include <スタック> #含む <climits> の#include <unordered_map> する#include <ビット/ STDC ++ H> // 使用して 名前空間STDを、 クラスのソリューション{ パブリック: どのように多くの木総ツリーはDP [i]のノードがある場合。 ベクター< INT > DP(N + 1 )。 DP [ 0 ] = DP [ 1 ] = 1 。 以下のために(int型 iは= 2 ; iがn + < 1 ; iは++ ){ ため(int型 J = 0 ; J <I、J ++ ){ DP [i]は + = DP [J] * DP [I - 1 - J ]; } } 戻りDP [n]は、 } }。 INT メイン() { ソリューション1秒; COUT << s.Num(5)<< ENDL。 リターン 0 ; }
DPのpythonのバージョン:
クラス溶液(オブジェクト): DEF numTrees(自己、N): DP = [ 1、1 ] のための I における範囲(2、N + 1 ): TMP = 0 のための J における範囲(I): TMP + = DP [J] * DP [I- 1 - J] dp.append(TMP) 戻りDP [I] ソル = ソリューション() プリント(solu.numTrees(5))