HDU 1023 Train Problem II (卡特兰数,经典)

题意:给出一个数字n,假设火车从1~n的顺序分别进站,求有多少种出站序列。

思路:卡特兰数的经典例子。n<101,用递推式解决。需要使用到大数。n=100时大概有200位以下。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=101;
 4 vector<string>  vect;
 5 void _mult(string num1, string num2, string &result )
 6 {
 7     reverse(num1.begin(),num1.end());    //反转
 8     reverse(num2.begin(),num2.end());
 9     result="";
10     int i, j, re_int[200];    //********这里的150是位数,根据需要可以增大或减小*********
11     memset(re_int, 0, sizeof(re_int));
12     for(i=0; i<num1.length(); i++)    //两串作乘法,结果存放于re_int数组中, 最多可达150位!
13         for(j=0; j<num2.length(); j++)
14             re_int[i+j] += ((num1[i]-48) * (num2[j]-48));
15     int jinwei=0, zhi;
16     for(i=0; i<num1.length()+num2.length(); i++)    //单独处理进位问题,上一步中的数组每个元素都有可能超过10的,所以没处理进位
17     {
18         zhi = re_int[i]+jinwei;
19         re_int[i] = zhi%10;
20         jinwei = zhi/10;
21     }
22     for(i=num1.length()+num2.length()-1; i>=0; i--)    //将i打个标记,数组re_int的前面部分可能全0,要去掉
23         if(re_int[i]!=0)    break;
24     for(;i>=0;i--)    //将整型数组转成字符串
25         result = result+(char)(re_int[i]+48);
26     if(result=="")    //若结果还是空,乘法的结果是0?
27         result="0";
28 }
29 void div(char * src,int n,char *dest)
30 {
31     int len = strlen(src),i,k,t=0,s=0;
32     bool flag = true;    //商是否有了第一个有效位,防止商首部一直出现0
33     for(i=0,k=0; i<len; i++)
34     {
35         t = s*10+(src[i]-48);    //新余数
36         if(t/n>0 || t==0)        //余数为0要修改商
37         {
38             dest[k++] = t/n+48,s = t%n,flag = false;
39         }
40         else                    //不够除,修改余数
41         {
42             s = t;
43             if(!flag)            //商已经有有效位了,补零
44                 dest[k++] = ‘0‘;
45         }
46     }
47     dest[k]=‘\0‘;
48 }
49
50 void precal()
51 {
52     string s="1";
53     vect.push_back(s);
54     vect.push_back(s);
55     char c[200], dest[200];
56     for(int i=2; i<101; i++)
57     {
58         string q1="",res;
59         int a=4*i-2; //第一个括号
60         while(a)
61         {
62             q1+=(a%10+‘0‘);
63             a/=10;
64         }
65         reverse(q1.begin(),q1.end());
66         _mult(q1,vect[i-1],res);    //乘法
67         strcpy(c,res.c_str());
68         div(c,i+1,dest);            //除法
69         s=dest;
70         vect.push_back(dest);
71     }
72 }
73 int main()
74 {
75     //freopen("e://input.txt", "r", stdin);
76     int n;
77     precal();
78     while(~scanf("%d", &n))
79         cout<<vect[n]<<endl;
80     return 0;
81 }

AC代码

时间: 2024-10-12 22:10:55

HDU 1023 Train Problem II (卡特兰数,经典)的相关文章

hdu 1023 Train Problem II 这题运用到大数相乘+大数相除+卡特兰数

Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6454    Accepted Submission(s): 3514 Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Stat

hdu acm 1023 Train Problem II -&gt;卡特兰(Catalan大数)

#include<iostream> using namespace std; struct Node //节点 { int num[105]; int len; //数的长度 } a[105]; void CalCatalen() //卡特兰数计算 { int i,j,len,c,t; //len长度,c进位 a[1].num[0]=a[1].len=1; len=1; for(i=2;i<=100;i++) { for(j=0;j<len;j++) //乘法,分子部分 a[i]

hdu 1023 Train Problem II

卡特兰数的应用 :卡特兰数参考kuangbing总结http://www.cnblogs.com/kuangbin/archive/2012/03/21/2410516.html. 大数的运算 hdu题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1023 1 #include<algorithm> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<iostream

hdu1023 Train Problem II(卡特兰数)

题目意思: http://acm.hdu.edu.cn/showproblem.php?pid=1023 求出第n个卡特兰数,n<1000. 题目分析: 很明显c(n)将很大,我们可以用大数模板,也可以用java中的大整数类,这里用到了java,将java在处理大数的时候还是很有优势的. AC代码: /** * java实现卡特兰数 * 前几项:1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786,208012- * 公式 C(n)=C(2n,n

HDU 1023 Train Problem II 大数打表Catalan数

一个出栈有多少种顺序的问题.一般都知道是Catalan数了. 问题是这个Catalan数非常大,故此须要使用高精度计算. 并且打表会速度快非常多.打表公式要熟记: Catalan数公式 Cn=C(2n,n) / (n+1); 递推公式 C(n ) = C(n-1)*(4*n-2) / (n+1) 高精度乘以一个整数和高精度除以一个整数的知识.这样还是使用整数数组比較好计算,假设使用string那么就不太好计算了,由于整数也可能是多位的. const int MAX_N = 101; short

hdoj 1023 Train Problem II 【卡特兰】+【高精度】

题意:询问有多少种进站出站的顺序. 经典卡特兰.我对卡特兰目前的认识就是有n个1和n个-1,组成一个为2n的数列的方式有多少种.这就跟火车进站出站类似, 至于具体的卡特兰数的介绍,百度解释的很详细. 代码1(c语言): /* h(n) = h(n-1)*(4*n-2)/(n+1); */ #include <stdio.h> #include <string.h> #define M 110 int s[M][M] = {0}, b[M]; void init(){ s[1][0]

hdoj 1023 Train Problem II 【卡特兰数】

Train Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6928    Accepted Submission(s): 3750 Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Stat

Train Problem II 卡特兰裸题(入门题)

Train Problem II  题目大意:给你一个数n,表示有n辆火车,编号从1到n,从远方驶过来,问你有多少种出站的可能. 解题思路:模拟栈的问题而已.  卡特兰问题. 1 import java.math.*; 2 import java.util.*; 3 import java.io.*; 4 5 public class Main 6 { 7 static int MS=101; 8 public static void main(String[] args) 9 { 10 Sca

1023 Train Problem II(卡特兰数)

Problem Description As we all know the Train Problem I, the boss of the Ignatius Train Station want to know if all the trains come in strict-increasing order, how many orders that all the trains can get out of the railway. Input The input contains se