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