动态规划,转移方程已在代码中注释
#pragma warning(disable:4996)
#include<iostream>
using namespace std;
typedef long long LL;
const int maxn = 505, mod = 1000000007;
LL B[maxn][maxn], R[maxn][maxn], ans;
int N;
//R[h][i]=+{B[h][k]*B[h][i-1-k]}
//B[h][i]=+{(B[h-1][k]+R[h-1][k])*(B[h-1][i-1-k]+R[h-1][i-1-k])}
int main() {
cin >> N;
B[1][1] = 1, B[1][2] = 2, B[1][3] = 1;
for (int i = 1; i <= N; ++i)
for (int k = 0; i - 1 - k >= 0; ++k)
R[1][i] += B[1][k] * B[1][i - 1 - k];
for (int h = 2; h <= 10; ++h) {
for (int i = h; i <= N; ++i)
for (int k = 0; i - 1 - k >= 0; ++k)
B[h][i] = (B[h][i] + (B[h - 1][k] + R[h - 1][k])*(B[h - 1][i - 1 - k] + R[h - 1][i - 1 - k]))%mod;
for (int i = h; i <= N; ++i)
for (int k = 0; i - 1 - k >= 0; ++k)
R[h][i] = (R[h][i] + B[h][k] * B[h][i - 1 - k])%mod;
}
for (int h = 0; h <= N; ++h)
ans = (ans + B[h][N]) % mod;
cout << ans << endl;
}