P1044 [NOIP2003 普及组] 栈

/* #include<iostream> using namespace std; long n,f[20][20];//f数组记录方案 long dfs(int x,int y)//x是操作队列里元素的个数,y是栈里的个数 { if(f[x][y]!=0) return f[x][y];//记忆化,走过的方案直接调用 if(x==0) return 1;//当操作队列里没有了,就只有一种方案了 if(y>0) f[x][y]+=dfs(x,y-1);//栈里不为空的时候才可以把栈里的元素推出 f[x][y]+=dfs(x-1,y+1);//操作队列里元素减一,栈里元素加一 return f[x][y];//返回方案值 } int main() { cin>>n; cout<<dfs(n,0)<<endl; return 0; }*/ /* //This program is written by QiXingZhi #include <cstdio> int n, f[30]; int main() { //递推实现卡特兰数 scanf("%d", &n); f[0] = 1, f[1] = 1; for(int i=2; i<=n; i++) for(int j=0; j<i; j++) f[i] += f[j] * f[i-j-1]; //递推公式 printf("%d", f[n]); return 0; }*/ #include<iostream> #include<cstdio> #include<cstring>//为了NOIP不用万能头文件 using namespace std; int f[20][20];//数据就给到18,开个20算大方的 int n; int main() { memset(f,0,sizeof(f)); scanf("%d",&n); for(int i=0;i<=n;i++) f[i][0]=1;//边界一定要有 for(int j=1;j<=n;j++)//i依赖于j的状态 for(int i=0;i<=n;i++) { if(i>=1) f[i][j]=f[i-1][j]+f[i+1][j-1]; if(i==0)//栈内没有东西 f[i][j]=f[i+1][j-1]; } printf("%d",f[0][n]); return 0; }