国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

51Nod-1603-限高二叉排列樹

2019-11-06 06:01:54
字體:
來源:轉載
供稿:網友

ACM模版

描述

描述

題解

題目好長,長得我看了兩遍都沒有看懂,看來學理工科時間長了,語文水平有所下降。

簡單地說,也就是求 n 個結點所能構成的高度大于等于 h 的二叉樹種數。典型的 dp 問題,設 dp[i][j] 表示 i 個結點且高度小于等于 j 的樹個數,中間利用乘法原理合并樹累加求各個狀態結果,最后輸出 dp[n][n] - dp[n][h - 1] 即可。

代碼

#include <iostream>using namespace std;typedef long long ll;const int MAXN = 40;ll dp[MAXN][MAXN]; // dp[i][j] i 個結點且高度小于等于 j 的樹個數int main(){ int n, h; scanf("%d%d", &n, &h); for (int i = 0; i <= n; i++) { dp[0][i] = 1; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { for (int k = 1; k <= i; k++) { dp[i][j] += dp[k - 1][j - 1] * dp[i - k][j - 1]; // 乘法原理合并樹 } } } cout << dp[n][n] - dp[n][h - 1] << endl; return 0; }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广丰县| 哈尔滨市| 颍上县| 康平县| 大同县| 阿巴嘎旗| 新宾| 多伦县| 澄城县| 高清| 中阳县| 南靖县| 昂仁县| 阜南县| 新巴尔虎右旗| 福安市| 本溪| 吉安市| 楚雄市| 泗水县| 彰化市| 韶山市| 永吉县| 枣庄市| 宜宾市| 威宁| 吉木乃县| 吉木萨尔县| 丹寨县| 边坝县| 合作市| 亚东县| 博乐市| 宁陕县| 长宁县| 江口县| 福清市| 英山县| 英山县| 新巴尔虎左旗| 东海县|