usaco-Cow Pedigrees

//usaco-Cow Pedigrees /* * 类型:动态规划 * 状态表示:dp[n][k]表示用n个节点组成前 k(1、2、……k) 层深度的树的种类数 * 则结果可以表示为dp[n][k]-dp[n][k-1] * 根据树的左右子树确定该树,可以通过左右子树方案数来推该树的方案数 * 左右子树 相互独立 需要用乘法原理 * 状态转移:dp[n][k]=sum( dp[m][k-1]*dp[n-1-m][k-1]) (m=1、2……n-2) * !!!偶数节点的方案数为0 * 初始化:dp[1][n]=1 * 由于每次要mod9901,dp[n][k]可能小于dp[n][k-1] * */ #include #include #include using namespace std; #define MAX 201 int dp[MAX][MAX]; int main(void) { int i,j,m,N,K; ifstream fin("nocows.in"); ofstream fout("nocows.out"); cin>>N>>K; for(i=0; i<=N; ++i) dp[1][i]=1; for(i=2; i<=K; ++i) for(j=3; j<=N; j+=2){ for(m=1; m<=j-2; m+=2) dp[j][i]=(dp[j][i]+dp[m][i-1]*dp[j-1-m][i-1])%9901; } cout<<(9901+dp[N][K]-dp[N][K-1])%9901<

你可能感兴趣的:(USACO)