链接
Pills - http://acm.hdu.edu.cn/showproblem.php?pid=4165
分析
- 共N片,每一片都会被取到,因此取到完整的一片的次数是N
- 每一次取到完整的一片,都会有半片放回,故共有N个半片
- 每一个半片都会被取到
- 取到完整的一片次数一定不少于取到半片的次数
- 结论:符合 ± 1 \pm1 ±1 模型,因此判定是卡特兰数
代码
从哪里来?【0MS】
#include <bits/stdc++.h>
using namespace std;
#define MXN 35
long long c[MXN] = {1,1};
void init(){
for(int i = 2; i < MXN; i++){
for(int j = 0; j < i; j++){
c[i] += c[j]*c[i-j-1];
}
}
}
int main(){
int n;
init();
while(scanf("%d", &n), n){
cout << c[n] << endl;
}
return 0;
}
到哪里去?【0MS】
#include <bits/stdc++.h>
using namespace std;
#define MXN 35
long long c[MXN<<1] = {1};
void init(){
for(int i = 0; i < MXN; i++){
for(int j = 0; j <= i; j++){
c[j+i+1] += (i==j?1:2)*c[j]*c[i];
}
}
}
int main(){
int n;
init();
while(scanf("%d", &n), n){
cout << c[n] << endl;
}
return 0;
}