程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Codeforces_9D-How many trees?

Codeforces_9D-How many trees?

編輯:C++入門知識

[cpp]
/**題目大意:給定1~n各節點,建立二叉搜索樹,求樹的深度大於等於h的個數
 *本題糾結一天未果,最後根據某大牛的思路寫來了。
 *狀態轉移方程:   dp[n][h] = sum{dp[i][h-1] * dp[n-i-1][h-1]};
 *其中: n為數的節點數, h數的深度, dp[n][h]為以n個節點建立的深度不大於
 *h的樹的個數;   i為左子樹的節點數, n-i-1為右子樹的節點數, 左子樹的
 *總數乘以右子樹的總數即為該二叉樹的總數。 www.2cto.com
 *初始狀態: dp[i][0] = 0;  dp[0][i] = 1; (0<=i<n)
 *打表求出所有解,然後dp[n][n] - dp[n][h-1] 即為深度大於h的個數
 *                (不大於n的減去不大於h-1)
 */  
#include <cstdio> 
using namespace std; 
 
#define MAX 36 
 
long long dp[MAX][MAX]; 
 
void binary_search_tree(){ 
    for(int h = 1; h < MAX; h ++){ 
        dp[0][h-1] = 1; 
        for(int n = 1; n < MAX; n ++){ 
            for(int i= 0; i < n; i ++){ 
                dp[n][h] += dp[i][h-1] * dp[n-i-1][h-1]; 
            } 
        } 
    } 

 
int main(int argc, char const *argv[]) 

#ifndef ONLINE_JUDGE 
        freopen("test.in", "r", stdin); 
#endif 
    binary_search_tree(); 
    int n, h; 
    while( ~scanf("%d %d", &n, &h) ){ 
        printf("%lld\n", dp[n][n] - dp[n][h-1]); 
    } 
    return 0; 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved