您的位置:首页 > 其它

2.3.2(wonderful)

2016-03-25 16:04 323 查看
/*
ID:18861501
LANG:C++
TASK:nocows
*/
/*------------------Header Files------------------*/
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <ctype.h>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
#include <vector>
#include <limits.h>
using namespace std;
/*------------------Definitions-------------------*/
#define LL long long
#define PI acos(-1.0)
#define INF 0x3F3F3F3F
#define MOD 9901
/*---------------------Work-----------------------*/
//基本思想是动态规划,因为树是递归结构,所以可以递归分成子问题处理
//一个树可以看成根加左子树加右子树,
//所以根据乘法原理,N个节点放成k层的结构等于i个节点放成k - 1层乘以N - i - 1个节点放在k - 1层的积。
//令dp[i][j] 为i个节点放j层的最多可能数量,则dp[i][j] = sum{dp[k][j - 1] * dp[i - k - 1][j - 1] + 9901} % 9901
int N,K;
int dp[205][105];
void work()
{
memset(dp,0,sizeof(dp));  //也是边界数据,为0
cin>>N>>K;
for(int i=1;i<=K;i++) dp[1][i]=1;  //边界数据:dp[1][i]=1
for(int j=1;j<=K;j++)  //层递增,结点数每次+2递增
for(int i=1;i<=N;i+=2)
for(int k=1;k<=i-2;k+=2)
dp[i][j]=(dp[i][j]+dp[k][j-1]*dp[i-k-1][j-1])%MOD;  //先加后取模和先取模后加一样
printf("%d\n",(dp
[K]-dp
[K-1]+MOD)%MOD);  //可能最后前<后,所以根据取模公式先+MOD
}
/*------------------Main Function------------------*/
int main()
{
//freopen("test.txt","r",stdin);
freopen("nocows.out","w",stdout);
freopen("nocows.in","r",stdin);
work();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: