POJ2084 Game of Connections(数学,dp)
题目链接。
分析:
简单的 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)相关推荐
- codeforces1497 E. Square-free division(数学+dp)
开学了,感觉没时间打cf了,上课听不懂,而且一直在忙转班的事情~~ 下周就要回学校了开心 昨天卡C题太久了,一直在想lcm的性质,还好最后回头了,当成构造题做了,瞎搞了搞就出来了,然后看D,由于没有看 ...
- Codeforces Round #750 (Div. 2)E. Pchelyonok and Segments (数学+DP)
链接 君子,修身齐家,治国平天下. 题意: Pchelyonok决定给Mila一件礼物.Pchelyonok已经"买"了一个长度为 n 的数组 a,但他觉得送一个数组太普通了.他决 ...
- 1226. 包子凑数 数学 dp 完全背包
小明几乎每天早晨都会在一家包子铺吃早餐. 他发现这家包子铺有 N 种蒸笼,其中第 i 种蒸笼恰好能放 Ai 个包子. 每种蒸笼都有非常多笼,可以认为是无限笼. 每当有顾客想买 X 个包子,卖包子的大叔 ...
- 第三讲 数学与简单DP【完结】
目录 1205. 买不到的数目 [数学结论题] 1211. 蚂蚁感冒 [模拟 / 推理] 1216. 饮料换购 [简单 / 模拟] 2. 01背包问题 [板子题] 1015. 摘花生 [简单DP] 8 ...
- 狂补dp Atcoder Educational DP Contest(全)
狂补dp Atcoder Educational DP Contest(全) 注意 为了减少篇幅,本博客代码部分只放主代码部分,其余省略快读.快输.头文件等代码,即把代码看做伪代码更佳 A - Fro ...
- 【原创】【个人向】CSP-S 2019 爆炸退役记 (已完成)
占坑. 说在前面 Day -84 蒟蒻就该有蒟蒻的亚子. 我有什么本事 我有什么进路 我自己清楚得很 Noip2016只参加了普及组. Noip2017Day2发高烧没去. Noip2018没有好好准 ...
- 7.30 正睿暑期集训营 A班训练赛
目录 2018.7.30 正睿暑期集训营 A班训练赛 T1 A.蔡老板分果子(Hash) T2 B.蔡老板送外卖(并查集 最小生成树) T3 C.蔡老板学数学(DP NTT) 考试代码 T2 T3 2 ...
- LeetCode 700题 题解答案集合 Python
2019.5.12更新至题号796,目前共有265题. 2019.5.26更新至题号72, 目前共有347题. 2019.6.16更新至题号70,目前共有382题. 2019.7.7更新至题号5120 ...
- oracle replace更新,Oracle replace函数使用
需求是要修改Oracle某列表中把这一列中全部的100换成200: update b_nodes a set a.childs=replace((select childs from b_nodes ...
最新文章
- python修改excel数据-python之实现对excel表格数据的修改
- 没有4G时代,有的只是后3G时代
- Python调用HTTP接口并传递cookie
- 计算机语言up,TweakBit PCSpeedUp
- ADO.NET Entity Framework 使用中的经验总结
- 宝塔Linux怎么安装Mariadb,如何在linux上面安装mariadb总结
- docker php示例,Docker 编程语言之 PHP
- 认识XP下的NetBEUI
- 我的知识管理工具列表
- [非线性控制理论]8_三种鲁棒控制器的比较
- silklabo哪个公众号有资源_公众号和头条号,做哪个赚钱?
- oracle 之除数不为0
- 普通文本与富文本,超文本之间的区别
- Darkside勒索病毒的网络防御措施
- canvas 画图 android,Android 中的Canvas画图
- MySQL数据恢复(通过.frm和.idb文件)
- 耦合式无线充电系统设计记录_3
- sourceforge空间搭建wordpress个人博客
- 互联网摸鱼日报(2022-12-21)
- 事件研究法——stata实现并购的超额回报率计算