题目链接。

分析:

简单的 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代码如下:

#include<iostream>
#include<string>
#include<algorithm>
#include <cstdio>
#include <cstring>using namespace std;#define MAXN 9999
#define DLEN 4class BigNum
{
private:int a[50];    //可以控制大数的位数int len;       //大数长度
public:BigNum(){ len = 1; memset(a,0,sizeof(a)); }   //构造函数BigNum(const int);       //将一个int类型的变量转化为大数BigNum(const BigNum &);  //拷贝构造函数BigNum &operator=(const BigNum &);   //重载赋值运算符,大数之间进行赋值运算
friend ostream& operator<<(ostream&,  BigNum&);   //重载输出运算符
BigNum operator+(const BigNum &) const;   //重载加法运算符,两个大数之间的相加运算BigNum operator*(const BigNum &) const;   //重载乘法运算符,两个大数之间的相乘运算bool   operator>(const int & t)const;      //大数和一个int类型的变量的大小比较bool   operator>(const BigNum & T)const;   //大数和另一个大数的大小比较
};BigNum dp[220][220];BigNum d(int x, int y) {if(x == y) return 1;if(x > y) return 1;if(dp[x][y] > 0) return dp[x][y];if(y - x == 1) return (dp[x][y] = 1);BigNum ans = 0;for(int i = x+1; i <= y; i +=2) {ans = ans + d(x+1, i-1)*d(i+1, y);}return (dp[x][y] = ans);
}int main(){int n;while(scanf("%d", &n) == 1 && n != -1) {BigNum ans = d(1, 2*n);cout << ans << endl;}return 0;
}BigNum::BigNum(const int b)     //将一个int类型的变量转化为大数
{int c,d = b;len = 0;memset(a,0,sizeof(a));while(d > MAXN){c = d - (d / (MAXN + 1)) * (MAXN + 1);d = d / (MAXN + 1);a[len++] = c;}a[len++] = d;
}
BigNum::BigNum(const BigNum & T) : len(T.len)  //拷贝构造函数
{int i;memset(a,0,sizeof(a));for(i = 0 ; i < len ; i++)a[i] = T.a[i];
}
BigNum & BigNum::operator=(const BigNum & n)   //重载赋值运算符,大数之间进行赋值运算
{int i;len = n.len;memset(a,0,sizeof(a));for(i = 0 ; i < len ; i++)a[i] = n.a[i];return *this;
}ostream& operator<<(ostream& out,  BigNum& b)   //重载输出运算符
{int i;cout << b.a[b.len - 1];for(i = b.len - 2 ; i >= 0 ; i--){cout.width(DLEN);cout.fill('0');cout << b.a[i];}return out;
}BigNum BigNum::operator+(const BigNum & T) const   //两个大数之间的相加运算
{BigNum t(*this);int i,big;      //位数big = T.len > len ? T.len : len;for(i = 0 ; i < big ; i++){t.a[i] +=T.a[i];if(t.a[i] > MAXN){t.a[i + 1]++;t.a[i] -=MAXN+1;}}if(t.a[big] != 0)t.len = big + 1;elset.len = big;return t;
}BigNum BigNum::operator*(const BigNum & T) const   //两个大数之间的相乘运算
{BigNum ret;int i,j,up;int temp,temp1;for(i = 0 ; i < len ; i++){up = 0;for(j = 0 ; j < T.len ; j++){temp = a[i] * T.a[j] + ret.a[i + j] + up;if(temp > MAXN){temp1 = temp - temp / (MAXN + 1) * (MAXN + 1);up = temp / (MAXN + 1);ret.a[i + j] = temp1;}else{up = 0;ret.a[i + j] = temp;}}if(up != 0)ret.a[i + j] = up;}ret.len = i + j;while(ret.a[ret.len - 1] == 0 && ret.len > 1)ret.len--;return ret;
}
bool BigNum::operator >(const int & t) const    //大数和一个int类型的变量的大小比较
{BigNum b(t);return *this>b;
}bool BigNum::operator>(const BigNum & T) const   //大数和另一个大数的大小比较
{int ln;if(len > T.len)return true;else if(len == T.len){ln = len - 1;while(a[ln] == T.a[ln] && ln >= 0)ln--;if(ln >= 0 && a[ln] > T.a[ln])return true;elsereturn false;}elsereturn false;
}

转载于:https://www.cnblogs.com/tanhehe/p/3234885.html

POJ2084 Game of Connections(数学,dp)相关推荐

  1. codeforces1497 E. Square-free division(数学+dp)

    开学了,感觉没时间打cf了,上课听不懂,而且一直在忙转班的事情~~ 下周就要回学校了开心 昨天卡C题太久了,一直在想lcm的性质,还好最后回头了,当成构造题做了,瞎搞了搞就出来了,然后看D,由于没有看 ...

  2. Codeforces Round #750 (Div. 2)E. Pchelyonok and Segments (数学+DP)

    链接 君子,修身齐家,治国平天下. 题意: Pchelyonok决定给Mila一件礼物.Pchelyonok已经"买"了一个长度为 n 的数组 a,但他觉得送一个数组太普通了.他决 ...

  3. 1226. 包子凑数 数学 dp 完全背包

    小明几乎每天早晨都会在一家包子铺吃早餐. 他发现这家包子铺有 N 种蒸笼,其中第 i 种蒸笼恰好能放 Ai 个包子. 每种蒸笼都有非常多笼,可以认为是无限笼. 每当有顾客想买 X 个包子,卖包子的大叔 ...

  4. 第三讲 数学与简单DP【完结】

    目录 1205. 买不到的数目 [数学结论题] 1211. 蚂蚁感冒 [模拟 / 推理] 1216. 饮料换购 [简单 / 模拟] 2. 01背包问题 [板子题] 1015. 摘花生 [简单DP] 8 ...

  5. 狂补dp Atcoder Educational DP Contest(全)

    狂补dp Atcoder Educational DP Contest(全) 注意 为了减少篇幅,本博客代码部分只放主代码部分,其余省略快读.快输.头文件等代码,即把代码看做伪代码更佳 A - Fro ...

  6. 【原创】【个人向】CSP-S 2019 爆炸退役记 (已完成)

    占坑. 说在前面 Day -84 蒟蒻就该有蒟蒻的亚子. 我有什么本事 我有什么进路 我自己清楚得很 Noip2016只参加了普及组. Noip2017Day2发高烧没去. Noip2018没有好好准 ...

  7. 7.30 正睿暑期集训营 A班训练赛

    目录 2018.7.30 正睿暑期集训营 A班训练赛 T1 A.蔡老板分果子(Hash) T2 B.蔡老板送外卖(并查集 最小生成树) T3 C.蔡老板学数学(DP NTT) 考试代码 T2 T3 2 ...

  8. LeetCode 700题 题解答案集合 Python

    2019.5.12更新至题号796,目前共有265题. 2019.5.26更新至题号72, 目前共有347题. 2019.6.16更新至题号70,目前共有382题. 2019.7.7更新至题号5120 ...

  9. oracle replace更新,Oracle replace函数使用

    需求是要修改Oracle某列表中把这一列中全部的100换成200: update b_nodes a set a.childs=replace((select childs from b_nodes ...

最新文章

  1. python修改excel数据-python之实现对excel表格数据的修改
  2. 没有4G时代,有的只是后3G时代
  3. Python调用HTTP接口并传递cookie
  4. 计算机语言up,TweakBit PCSpeedUp
  5. ADO.NET Entity Framework 使用中的经验总结
  6. 宝塔Linux怎么安装Mariadb,如何在linux上面安装mariadb总结
  7. docker php示例,Docker 编程语言之 PHP
  8. 认识XP下的NetBEUI
  9. 我的知识管理工具列表
  10. [非线性控制理论]8_三种鲁棒控制器的比较
  11. silklabo哪个公众号有资源_公众号和头条号,做哪个赚钱?
  12. oracle 之除数不为0
  13. 普通文本与富文本,超文本之间的区别
  14. Darkside勒索病毒的网络防御措施
  15. canvas 画图 android,Android 中的Canvas画图
  16. MySQL数据恢复(通过.frm和.idb文件)
  17. 耦合式无线充电系统设计记录_3
  18. sourceforge空间搭建wordpress个人博客
  19. 互联网摸鱼日报(2022-12-21)
  20. 事件研究法——stata实现并购的超额回报率计算

热门文章

  1. 软件测试系列之四 单元测试(Junit)
  2. openresty配置部署
  3. 基础练习 十进制转十六进制 C语言
  4. JSON入门之二:org.json的基本用法
  5. python单元测试
  6. js实现鼠标拖拽功能基本思路
  7. 分布式理论(七): 一致性协议之 ZAB
  8. Android组件化开发实践(九):自定义Gradle插件
  9. js操作样式自动prefix
  10. 《微信公众平台开发最佳实践》——2.4 本章小结