题目链接:51nod 1412 AVL树的种类
开始做的时候把深度开得过小了结果一直WA,是我天真了。。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<queue> 5 using namespace std; 6 typedef long long ll; 7 const int mod = 1e9+7; 8 const int N = 2001; 9 ll dp[N][16];//dp[i][k] i:节点数, k:深度 10 void solve(){ 11 int i, j, k; 12 dp[0][0] = dp[1][1] = 1; 13 for(i = 2; i < N; ++i){ 14 for(k = 2; k < 16; ++k){ 15 for(j = 0; j < i; ++j){ 16 //j为右子树的节点数,左右子树节点之和为i-1 17 //左右子树深度相同 18 dp[i][k] += dp[i-1-j][k-1] * dp[j][k-1]; 19 //左右子树深度差一 20 dp[i][k] += 2 * dp[i-1-j][k-2] * dp[j][k-1]; 21 dp[i][k] %= mod; 22 } 23 } 24 } 25 } 26 int main(){ 27 int n, i; 28 ll ans = 0; 29 solve(); 30 scanf("%d", &n); 31 for(i = 1; i < 16; ++i){ 32 ans += dp[n][i]; 33 } 34 ans %= mod; 35 printf("%lld ", ans); 36 return 0; 37 }