题目大意
求对一个长度为 n n n的序列中的每一个元素都经过了入栈和出栈的操作后可能出现的不同出栈顺序的数量。
题目分析
设 f i , j f_{i,j} fi,j为有 i i i个元素待处理,其中有 j j j个元素未入栈时可能出现的不同出栈顺序的数量。
当
j
=
0
j=0
j=0时
全部元素已经入栈,此时只能按顺序将栈中元素全部出栈,方案数为
1
1
1
所以
f
i
,
0
=
1
(
1
≤
i
≤
n
)
f_{i,0}=1(1 \leq i \leq n)
fi,0=1(1≤i≤n)
当
j
≠
0
j \neq 0
j=0时
只有两种操作,考虑这两种操作对于
f
i
,
j
f_{i,j}
fi,j的贡献:
- 假如将下一个元素入栈,则对 f i , j f_{i,j} fi,j来说有 f i , j − 1 f_{i,j-1} fi,j−1的贡献。
- 假如将栈顶元素出栈,则对 f i , j f_{i,j} fi,j来说有 f i − 1 , j f_{i-1,j} fi−1,j的贡献。
所以 f i , j = f i , j − 1 + f i − 1 , j f_{i,j}=f_{i,j-1}+f_{i-1,j} fi,j=fi,j−1+fi−1,j
C o d e Code Code
#include<iostream>
#include<cstdio>
#define sco 100
#define ll long long
using namespace std;
ll n,f[sco][sco];
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;++i){
f[i][0]=1ll;
for(int j=1;j<=i;++j){
f[i][j]=f[i-1][j]+f[i][j-1];
}
}
printf("%lld",f[n][n]);
}