hdu 1023 Train Problem II(卡特兰数的应用)出栈序列的统计
http://baike.baidu.com/view/2499752.htm卡特兰数的应用。。。
http://acm.hdu.edu.cn/showproblem.php?pid=1023
公式:
令h(1)=1,h(2)=2,catalan数满足递归式:
h(n)= h(1)*h(n-1)+h(2)*h(n-2) + ... + h(n-1)h(1) (其中n>=3)
例如:h(3)=h(1)*h(2)+h(2)*h(1)=1*1+1*1=2
h(4)=h(1)*h(3)+h(2)*h(2)+h(3)*h(1)=1*2+1*1+2*1=5
另类递归式:
h(n)=h(n-1)*(4*n-2)/(n+1);
该递推关系的解为:
h(n)=C(2n,n)/(n+1) (n=1,2,3,...)
这里刚开始我用的递推关系式,结果数据太大,越界了。。。原来还要考大数的处理。。。所以要用递归式。。
这是期末考试结束后第一道题目,很久都没做题了,有点生疏了,思维也懒惰了许多,好想放松自己去玩,可是自己不能忘记自己心中的梦想。加油!。。。。E_star
View Code
#include <iostream>
#include <cstdio>
using namespace std;
int a[105][105],b[105];//b用来记录数字长度,a来存数字
int main(){
int i,j,len,tmp,r,n;
a[1][0]=1;
b[1]=1;
len=1;
for(i=2;i<105;i++){
for(j=0;j<len;j++){//乘法运算
a[i][j]=a[i-1][j]*(4*i-2);
}
for(j=r=0;j<len;j++){//乘后的处理
tmp=a[i][j]+r;
a[i][j]=tmp%10;
r=tmp/10;
}
while(r){//进位的处理
a[i][len++]=r%10;
r=r/10;
}
for(j=len-1;j>=0;j--){//除法运算
tmp=a[i][j]+r*10;
a[i][j]=tmp/(i+1);
r=tmp%(i+1);
}
while(a[i][len-1]==0){//前导0的处理
len--;
}
b[i]=len;
}
while(scanf("%d",&n)!=EOF){
for(i=b[n]-1;i>=0;i--)
cout<<a[n][i];
cout<<endl;
}
return 0;
}