题目链接

分析:

简单的 Catalan 数

将x~y编号,设解为 d(x, y), d(x, y) = {d(x+1,i-1)*d(i+1,y)}, 其中 x+1<= i  <= y, 注意x~y之间的数必须为偶数个。

这题除了要dp,还要使用大数(竟然有种想用java的冲动了)。大数呢,用了下现成的模板。

AC代码如下:

  1. #include<iostream>
  2. #include<string>
  3. #include<algorithm>
  4. #include <cstdio>
  5. #include <cstring>
  6.  
  7. using namespace std;
  8.  
  9. #define MAXN 9999
  10. #define DLEN 4
  11.  
  12. class BigNum
  13. {
  14. private:
  15. int a[]; //可以控制大数的位数
  16. int len; //大数长度
  17. public:
  18. BigNum(){ len = ; memset(a,,sizeof(a)); } //构造函数
  19. BigNum(const int); //将一个int类型的变量转化为大数
  20. BigNum(const BigNum &); //拷贝构造函数
  21. BigNum &operator=(const BigNum &); //重载赋值运算符,大数之间进行赋值运算
  22.  
  23. friend ostream& operator<<(ostream&, BigNum&); //重载输出运算符
  24.  
  25. BigNum operator+(const BigNum &) const; //重载加法运算符,两个大数之间的相加运算
  26. BigNum operator*(const BigNum &) const; //重载乘法运算符,两个大数之间的相乘运算
  27.  
  28. bool operator>(const int & t)const; //大数和一个int类型的变量的大小比较
  29. bool operator>(const BigNum & T)const; //大数和另一个大数的大小比较
  30. };
  31.  
  32. BigNum dp[][];
  33.  
  34. BigNum d(int x, int y) {
  35. if(x == y) return ;
  36. if(x > y) return ;
  37.  
  38. if(dp[x][y] > ) return dp[x][y];
  39. if(y - x == ) return (dp[x][y] = );
  40.  
  41. BigNum ans = ;
  42. for(int i = x+; i <= y; i +=) {
  43. ans = ans + d(x+, i-)*d(i+, y);
  44. }
  45.  
  46. return (dp[x][y] = ans);
  47. }
  48.  
  49. int main(){
  50. int n;
  51.  
  52. while(scanf("%d", &n) == && n != -) {
  53. BigNum ans = d(, *n);
  54. cout << ans << endl;
  55. }
  56.  
  57. return ;
  58. }
  59.  
  60. BigNum::BigNum(const int b) //将一个int类型的变量转化为大数
  61. {
  62. int c,d = b;
  63. len = ;
  64. memset(a,,sizeof(a));
  65. while(d > MAXN)
  66. {
  67. c = d - (d / (MAXN + )) * (MAXN + );
  68. d = d / (MAXN + );
  69. a[len++] = c;
  70. }
  71. a[len++] = d;
  72. }
  73. BigNum::BigNum(const BigNum & T) : len(T.len) //拷贝构造函数
  74. {
  75. int i;
  76. memset(a,,sizeof(a));
  77. for(i = ; i < len ; i++)
  78. a[i] = T.a[i];
  79. }
  80. BigNum & BigNum::operator=(const BigNum & n) //重载赋值运算符,大数之间进行赋值运算
  81. {
  82. int i;
  83. len = n.len;
  84. memset(a,,sizeof(a));
  85. for(i = ; i < len ; i++)
  86. a[i] = n.a[i];
  87. return *this;
  88. }
  89.  
  90. ostream& operator<<(ostream& out, BigNum& b) //重载输出运算符
  91. {
  92. int i;
  93. cout << b.a[b.len - ];
  94. for(i = b.len - ; i >= ; i--)
  95. {
  96. cout.width(DLEN);
  97. cout.fill('');
  98. cout << b.a[i];
  99. }
  100. return out;
  101. }
  102.  
  103. BigNum BigNum::operator+(const BigNum & T) const //两个大数之间的相加运算
  104. {
  105. BigNum t(*this);
  106. int i,big; //位数
  107. big = T.len > len ? T.len : len;
  108. for(i = ; i < big ; i++)
  109. {
  110. t.a[i] +=T.a[i];
  111. if(t.a[i] > MAXN)
  112. {
  113. t.a[i + ]++;
  114. t.a[i] -=MAXN+;
  115. }
  116. }
  117. if(t.a[big] != )
  118. t.len = big + ;
  119. else
  120. t.len = big;
  121. return t;
  122. }
  123.  
  124. BigNum BigNum::operator*(const BigNum & T) const //两个大数之间的相乘运算
  125. {
  126. BigNum ret;
  127. int i,j,up;
  128. int temp,temp1;
  129. for(i = ; i < len ; i++)
  130. {
  131. up = ;
  132. for(j = ; j < T.len ; j++)
  133. {
  134. temp = a[i] * T.a[j] + ret.a[i + j] + up;
  135. if(temp > MAXN)
  136. {
  137. temp1 = temp - temp / (MAXN + ) * (MAXN + );
  138. up = temp / (MAXN + );
  139. ret.a[i + j] = temp1;
  140. }
  141. else
  142. {
  143. up = ;
  144. ret.a[i + j] = temp;
  145. }
  146. }
  147. if(up != )
  148. ret.a[i + j] = up;
  149. }
  150. ret.len = i + j;
  151. while(ret.a[ret.len - ] == && ret.len > )
  152. ret.len--;
  153. return ret;
  154. }
  155. bool BigNum::operator >(const int & t) const //大数和一个int类型的变量的大小比较
  156. {
  157. BigNum b(t);
  158. return *this>b;
  159. }
  160.  
  161. bool BigNum::operator>(const BigNum & T) const //大数和另一个大数的大小比较
  162. {
  163. int ln;
  164. if(len > T.len)
  165. return true;
  166. else if(len == T.len)
  167. {
  168. ln = len - ;
  169. while(a[ln] == T.a[ln] && ln >= )
  170. ln--;
  171. if(ln >= && a[ln] > T.a[ln])
  172. return true;
  173. else
  174. return false;
  175. }
  176. else
  177. return false;
  178. }

POJ2084 Game of Connections(数学,dp)的更多相关文章

  1. 数学+dp HDOJ 5317 RGCDQ

    题目传送门 /* 题意:给一个区间,问任意两个数的素数因子的GCD最大 数学+dp:预处理出f[i],发现f[i] <= 7,那么用dp[i][j] 记录前i个f[]个数为j的数有几个, dp[ ...

  2. 数学+DP Codeforces Round #304 (Div. 2) D. Soldier and Number Game

    题目传送门 /* 题意:这题就是求b+1到a的因子个数和. 数学+DP:a[i]保存i的最小因子,dp[i] = dp[i/a[i]] +1;再来一个前缀和 */ /***************** ...

  3. 拓扑排序+数学+DP【洛谷P1685】 游览

    P1685 游览 题目描述 顺利通过了黄药师的考验,下面就可以尽情游览桃花岛了! 你要从桃花岛的西头开始一直玩到东头,然后在东头的码头离开.可是当你游玩了一次后,发现桃花岛的景色实在是非常的美丽!!! ...

  4. HDU 1041 Computer Transformation 数学DP题解

    本题假设编程是使用DP思想直接打表就能够了. 假设是找规律就须要数学思维了. 规律就是看这些连续的0是从哪里来的. 我找到的规律是:1经过两次裂变之后就会产生一个00: 00经过两次裂变之后也会产生新 ...

  5. BZOJ 2302: [HAOI2011]Problem c(数学+DP)

    题面: bzoj_2302 题解: 令\(dp[i][j]\)表示编号 \(\leq i\)的人有j个的方案数: \(cnt[i]\)表示编号指定为\(i\)的人数,\(sum[i]\)表示编号可以\ ...

  6. Codeforces 772C 构造 数学 + dp + exgcd

    首先我们能注意到两个数x, y (0 < x , y < m) 乘以倍数互相可达当且仅当gcd(x, m) == gcd(y, m) 然后我们可以发现我们让gcd(x, m)从1开始出发走 ...

  7. CodeForces 402D Upgrading Array (数学+DP)

    题意:给出一个数列,可以进行一种操作将某一个前缀除去他们的gcd,有一个函数f(x),f(1) = 0 , f(x) = f(x/p)+1,f(x) = f(x/p)-1(p是坏素数), 求 sum( ...

  8. 拓扑排序+数学+DP【p1685】游览

    Description 顺利通过了黄药师的考验,下面就可以尽情游览桃花岛了! 你要从桃花岛的西头开始一直玩到东头,然后在东头的码头离开.可是当你游玩了一次后,发现桃花岛的景色实在是非常的美丽!!!于是 ...

  9. HDU - 1134 Game of Connections 【DP】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1134 题意 给出一个n 然后有2n个点 给两个点连一条边,最后连N条边,要求所有的边不能够交叉 问最多 ...

随机推荐

  1. DFU工作过程中USB机制

    在一级bootloader执行进入USB启动方式之后,设备进行枚举.枚举过程中会通过PC端发送命令对连接的USB设备进行枚举.当枚举成功之后,在PC端可以看到设备的盘符. 当设备能够被PC正确识别之后 ...

  2. hdu 1882 Strange Billboard(位运算+枚举)

    http://acm.hdu.edu.cn/showproblem.php?pid=1882 感觉非常不错的一道题. 给一个n*m(1<=n,m<=16)的矩阵,每一个格子都有黑白两面,当 ...

  3. Linux下有线无线网络配置------命令模式

    1. 列出启用网络设备的所有信息: ifconfig 2. 将网络设备设置为启用或者不启用 不启用设备eth0 ifconfig eth0 down 启用设备eth0: Will bring eth0 ...

  4. C#自定义事件:属性改变引发事件示例

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  5. PHP 实现ajax的接收

    Ajax界面: 首先,理解本质,就是普通的一个提交在无刷新的情况下发出请求后得到响应,然后去针对你需要 的情况来做行为. <!DOCTYPE html> <html> < ...

  6. 【转】iOS申请发布证书-图文详解

    摘要 发布产品到App Store所需证书,2013年5月26日测试 IOS 发布证书 distribution 打包程序 真机调试证书 本文讲述发布证书的申请,申请真机调试证书请参考:http:// ...

  7. UIScrollView不能响应touch事件的解决办法

    UIScrollView本身事是不支持touch的,我们可以给她添加拓展 #import "UIScrollView+util.h" @implementation UIScrol ...

  8. 05DotNet基本常用类库

    1.String成员方法(常用) bool Contains(String str);判断字符串对象是否包含给定的字符串; bool StartsWith(String str);判断字符串对象是否以 ...

  9. rhel-server-6.2-i386安装gcc、g++步骤

    安装的版本:rhel-server-6.2-i386 RHEL 6.2默认是没有gcc和gcc-c++环境的,而且我也没有$购买正版服务.只能本地安装了,总结方法如下: 上传安装镜像rhel-serv ...

  10. openMPI小集群安装

    经过一天的努力,终于完成了openMPI的多节点安装,即小集群安装.本文使用的是openmpi-1.6.5,下载地址见:http://www.open-mpi.org/software/ompi/v1 ...