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; }
相关文章推荐
- 那些年我们一起追过的缓存写法(一)
- Android实现插件化(热加载)和插件加密
- leetcode之 coin change
- tungsten内存分析
- 机器学习基础(二十)—— 数学语言与 Python 代码
- 码农小汪-struts2学习4-struts.xml 常用配置解析
- 操作系统典型调度算法
- java对象转换String类型
- 2.2.3
- 2.2.4(wonderful)
- HttpClient4.5简单使用
- min-height在安卓下不起作用
- 工作流设计
- 进程间通信--信号(进程间通信唯一的异步方式)
- 2.2.1(wonderful)
- 2.2.2(wonderful)
- 解决Android-PullToRefresh模块引用问题
- xshell 快捷键设置,使用大全
- 微服务(三)
- ASP.NET MVC 几种 Filter 的执行过程源码解析