`dp[n][h]` = 節點數 n、高度 h 的 AVL 樹數量。
根節點佔 1 個節點,剩餘 n-1 分配給左右子樹。AVL 條件限制左右子樹高度差 ≤ 1,故只有三種高度組合:
對每種組合,枚舉左子樹節點數 m,右子樹為 n-1-m,累加乘積。
const int MAXN = 1000;
vector<vector<long long>> dp(MAXN+1, vector<long long>(20, 0));
dp[0][0] = 1;
for (int n = 1; n <= MAXN; n++) {
for (int h = 1; h < 20; h++) {
long long ways = 0;
for (int m = 0; m <= n-1; m++) {
int r = n-1-m;
ways += dp[m][h-1] * dp[r][h-1];
if (h >= 2) ways += 2 * dp[m][h-1] * dp[r][h-2];
}
dp[n][h] = ways;
}
}
同一問題的不同角度解析,幫助理解 DP 狀態設計的靈活性。