题意给了n个节点 问AVL树的种类
卧槽 真的好傻 又忘记这种题可以打表了 就算n^3 也可以接受的
树的深度不大
那么转移方程很明显了
dp[i][j] 代表的是节点为n深度为j的树的种类
k为左子树的节点个数
//dp[i][j+1] += dp[k][j]*dp[i-k-1][j];
//dp[i][j+1] += 2*dp[k][j-1]*dp[i-k-1][j];
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <stdio.h> #include <iostream> #include <algorithm> #include <string.h> #include <math.h> using namespace std; const long long MOD = 1000000007; typedef long long ll; ll dp[2100][30];//i 表示个数 j表示深度 ll check(int x,int y) { return 0; } void init() { dp[0][0] = dp[1][1] = 1; //dp[i][j+1] += dp[k][j]*dp[i-k-1][j]; //dp[i][j+1] += 2*dp[k][j-1]*dp[i-k-1][j]; for(int i=2;i<=2000;i++) { for(int j=0;j<=17;j++) { for(int k=0;k<i;k++) { dp[i][j+1] += dp[k][j]*dp[i-k-1][j]; dp[i][j+1] += 2*dp[k][j-1]*dp[i-k-1][j]; dp[i][j+1]%=MOD; } } } } int main() { // 0 0 // 1 1 // 2 2 // 3 init(); int n; cin>>n; ll ans = 0; for(int i=0;i<30;i++) { ans += dp[n][i]; } cout<<ans%MOD<<endl; return 0; }