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;
}
View Code

 

 
 
 
 
 
posted @ 2023-08-18 14:05  JMXZ  阅读(9)  评论(0)    收藏  举报