4. [2003年NOIP普及组] 栈

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;

//因为我们要求的方案数,可以借用离散的思想——
//不用考虑每个数组中具体是那个数 
//只需要按照方案数来做即可

//DFS返回的是在此状态下未来将有的方案数 
int f[1005][1005];//i表示初始剩余,j表示中间栈里的数
//f[][]表示在这个状态之下“未来”再进行讨论的情况数 

int DFS(int i,int j)
{
    if(f[i][j]) return f[i][j];
    if(i==0) return 1;//边界 
    //i==0时数据全部在栈里,此时输出顺序唯一
    //j=1.j=2,j=3时,只要i==0那么方案数就是1 
    if(j==0)//栈空时的未来方案数 
        f[i][j]+=DFS(i-1,j+1);//只能进一下 
    else //栈非空时的未来方案数 
    {
        f[i][j]+=DFS(i-1,j+1);//进一下 
        f[i][j]+=DFS(i,j-1);//或者出一下
    } 
    return f[i][j];//递归回来就是i=n,j=0了 
 } 

int main()
{
    int n=0; 
    cin>>n;
    cout<<DFS(n,0);
    
    return 0;
}

 

posted @ 2022-09-18 19:06  要不要吃哈密瓜  阅读(43)  评论(0编辑  收藏  举报