思路:区间dp。
状态:dp[i][j]表示节点为i,高度小于等于j的方案数。
状态转移:dp[i][j]=∑dp[k][j-1]*dp[i-1-k][j-1]。
节点为i,高度等于j的方案数等于dp[i][j]-dp[i][j-1]。
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mp make_pair #define pi acos(-1.0) #define pii pair<int,int> #define mem(a,b) mam(a,b,sizeof(a)) const int MOD=9901; const int N=305; const int M=105; int dp[N][M]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n,m; cin>>n>>m; for(int j=1;j<M;j++)dp[1][j]=1; for(int i=3;i<N;i+=2) { for(int j=1;j<M;j++) { for(int k=1;k<=i-2;k+=2) { dp[i][j]=(dp[i][j]+dp[k][j-1]*dp[i-1-k][j-1])%MOD; } } } cout<<(dp[n][m]-dp[n][m-1]+9901)%MOD<<endl; return 0; }
本文介绍了一种使用区间动态规划解决技能树问题的方法。通过定义dp[i][j]为节点i时高度不超过j的方案数量,实现了有效的状态转移方程。文章提供了完整的C++实现代码,并展示了如何计算特定节点和高度下的所有可能配置。
4080

被折叠的 条评论
为什么被折叠?



