洛谷P1044栈

本题原本只想到写搜索....但是由于状态不会设定,连搜索也写的乱七八糟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

原文地址:https://www.cnblogs.com/conprour/p/14291341.html