先放一张图
在ACM中的例子有:
1.二叉树的计数
2.AB排列问题(n个A和n个B排成一排,从第一个位置开始到任何位置,B的个数不能超过A的个数)
3.乘法加括号(有多少种不同的运算顺序)
4.欧拉多边形分割问题(凸n边形用n-3条不相交的对角线分成n-2个互相没有重叠的三角形)
5.在圆上选择2n个点,将这些点成对链接起来使得所得到的n条线段不相交,一共有多少种方法
6.一个栈(无穷大)的进栈序列为1,2,3,…,n,有多少个不同的出栈序列
7.n*n的方格地图中,从一个角到另外一个角,不跨越对角线的路径数(两个角为对角)
8.n层的阶梯切割为n个矩形的切法数
用递归公式二进行求解
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int hex=10000;
int kat[110][110];
void mul(int k,int num){
int car=0;
for(int i=100;i>=0;i--){
car+=kat[k-1][i]*num;
kat[k][i]=car%hex;
car/=hex;
}
}
void division(int k,int num){
int car=0;
for(int i=0;i<=100;i++){
car=car*hex+kat[k][i];
kat[k][i]=car/num;
car%=num;
}
}
void init(){
memset(kat,0,sizeof(kat));
kat[1][100]=1;
for(int i=2;i<=100;i++){
int num=4*i-2;
mul(i,num);
num=i+1;
division(i,num);
}
}
int main(){
init();
int n;
while(scanf("%d",&n)&&n!=-1){
int pos;
for(int i=0;i<=100;i++){
if(kat[n][i]){
pos=i;
break;
}
}
printf("%d",kat[n][pos]);
for(int i=pos+1;i<=100;i++){
printf("%04d",kat[n][i]);
}
printf("\n");
}
return 0;
}