本题原本只想到写搜索....但是由于状态不会设定,连搜索也写的乱七八糟T^T
看完题解后才发现还有记忆化搜索,递推(dp),数论卡特兰数等等.....
主要问题在于状态设定:f[x][y]表示队列中x个数字,栈中y个数字的可能性数(记忆化搜索和dp的状态)
记忆化搜索:
#include<bits/stdc++.h>
using namespace std;
int n,f[25][25];
long long dfs(int x,int y)//x表示队列中元素,y表示栈内元素
{
if(x==0) return 1;
if(f[x][y]) return f[x][y];
f[x][y]+=dfs(x-1,y+1);
if(y>0) f[x][y]+=dfs(x,y-1);
return f[x][y];
}
int main()
{
scanf("%d",&n);
printf("%lld",dfs(n,0));
return 0;
}
dp:
#include<iostream>
#include<cstdio>
#include<cstring>//为了NOIP不用万能头文件
using namespace std;
int f[20][20];//数据就给到18,开个20算大方的
int n;
int main()
{
memset(f,0,sizeof(f));
scanf("%d",&n);
for(int i=0;i<=n;i++)
f[i][0]=1;//边界一定要有
for(int j=1;j<=n;j++)
for(int i=0;i<=n;i++)
//我们要推f[0][n],所以i要从零开始跑
{
if(i>=1)
f[i][j]=f[i-1][j]+f[i+1][j-1];
if(i==0)//栈内没有东西
f[i][j]=f[i+1][j-1];
}
printf("%d",f[0][n]);
return 0;
}
链接:https://www.luogu.com.cn/problem/solution/P1044