题目大意:
题目链接:http://10.156.31.134/contestnew.aspx?cid=123
有n个数依次进入最多容纳m的栈,求出栈的不同排列数。
思路:
如果没有m就是卡特兰数了。
设f[i][j]表示已经有i个数字进入过栈,期中有j个还在栈里的方案数。
下一步可以弹出栈顶或将下一个数入栈。所以方程就是
f[i][j]=f[i][j+1]+f[i−1][j−1]
最终答案就是f[n][0]了。
时间复杂度O(nm)
代码:
#include <cstdio>
#include <iostream>
using namespace std;
const int N=2010,MOD=4096;
int ans,n,m,f[N][N];
int main()
{
scanf("%d%d",&n,&m);
f[0][0]=1;
for (int i=1;i<=n;i++)
for (int j=min(i,m);j>=0;j--)
{
if (!j) f[i][j]=f[i][j+1];
else f[i][j]=(f[i][j+1]+f[i-1][j-1])%MOD;
}
printf("%d",f[n][0]);
return 0;
}