hdu 1023 Train Problem II

来源:互联网 发布:绘制流程图的软件 编辑:程序博客网 时间:2024/06/11 10:31

        题意:n个数以1,2,3,...,n这样的顺序进栈,问有多少种出栈顺序。

        思路:Catalan数+高精度运算。不知道什么是卡特兰数的自己百度,这里用了h(n)=h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)*h(0)这个递推式,没有除法。手算模拟高精度= =


#include <iostream>  #include <stdio.h>  #include <cmath>  #include <algorithm>  #include <iomanip>  #include <cstdlib>  #include <string>  #include <memory.h>  #include <vector>  #include <queue>  #include <stack>  #include <map>#include <set>#include <ctype.h>  #define INF 1000000using namespace std;int h[110][110];int getlen(int n){int k=0;for(int i=109;i>=0;i--){if(h[n][i]){k=i;break;}}return k;}void print(int n){int len=getlen(n);for(int i=len;i>=0;i--)printf("%d",h[n][i]);printf("\n");}int main(){memset(h,0,sizeof(h));h[0][0]=1;h[1][0]=1;h[2][0]=2;h[3][0]=5;for(int x=4;x<=100;x++){for(int k=x;k>0;k--){//h[x]+=h[k-1]*h[x-k]int leni=getlen(k-1);int lenj=getlen(x-k);for(int i=0;i<=leni+2;i++){//h[k-1]的位数 for(int j=0;j<=lenj+2;j++){//h[x-k]的位数 int tmp=h[k-1][i]*h[x-k][j];if(!tmp)continue;h[x][i+j]+=tmp;int carry=h[x][i+j]/10;h[x][i+j]%=10;int index=i+j+1;while(carry){h[x][index]+=carry;carry=h[x][index]/10;h[x][index]%=10;index++;}}}}}//int n;while(cin>>n){print(n);}return 0;}


0 0
原创粉丝点击