虽然你们都知道数的通项公式是:
但是不建议用通项公式做:
1.容易超时;
2.代码冗长;
3.需要高精度(能不开就不开)。
我之前试过,只得了20分(也有可能是因为我很糟糕)
这题还是用递推做比较好
首先我们设它上面(未入栈的)有个,下面(已入栈的)有
个,接下来我们就可以列表分析每种情况下经过操作可能得到的输出序列的总数(表中的第一行是n,第一列是k):
0 | 1 | 2 | 3 | 4 | |
0 | 1 | 1 | 2 | 5 | 14 |
1 | 1 | 2 | 5 | 14 | 42 |
2 | 1 | 3 | 9 | 28 | 90 |
3 | 1 | 4 | 14 | 48 | 165 |
4 | 1 | 5 | 20 | 75 | 275 |
我们可以发现,对于任意一种情况,
.但是在最后我们其实只要看第
行就可以了,因为如果看第1行,那么你的数组就要开到
,不但涉及到高精度(这个肯定是能不写就不写啊),还容易超时,所以就用它的替代品,所有下标为负数的地方都标为
,所以
.
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long z[19][19];
int n,k;
for(k=0;k<=18;k++) z[k][0]=1;
for(int n=1;n<=17;n++)
{
for(int k=0;k<=17;k++)
{
if(k==0) z[k][n]=z[k+1][n-1];
else z[k][n]=z[k-1][n]+z[k+1][n-1];
}
}
int i;
cin>>i;
cout<<z[1][i-1];
return 0;
}
因为作者非常糟糕,所以若有不足请在评论区中指出。