#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;
}
这里主要分析可行性,即为什么f[x][y]会等于这几个值累加?推究其原,其实是由于这n个数是各不相同的,因此我们只要分析队列中剩x,栈中剩y的情况,肯定是在由其他所有情况的基础上才能推出的,by the way,点睛之笔就是 if(f[x][y]!=0) return f[x][y],使得已经得出来的结果不用再重复计算。