【luogu】栈

首先说一下栈是什么以及和队列区别

栈和队列是两个有序列表,两者之间的区别就是栈是先进后出,而队列先进先出

栈的实现

int s[MAX_N],top=0;
void push(int x){s[++top]=x;}
int top(int x){return s[top];}
void pop(){top--;}
bool empty(){return top==0;}

stl中的栈

std::stack<int> s;
s.push(x);
s.pop();
s.top();
s.empty();

stl中的队列

std::queue<int> q;
q.push(x);
q.pop();
q.front();
q.empty();

双端队列 可以在队列两端进行插入删除

std::deque<int> dq
dq.push_back(x);
dq.push_front(x);
dq.pop_back();
dq.pop_front();
dq.back();
dq.front();
dq.empty();

一道例题

题目链接:https://www.luogu.com.cn/problem/P1044

虽然题目名字叫栈,但是整个题目的做法中并没有用到栈。

化简一下题目的意思即使:数列按照一定顺序入栈,但出栈并未规定顺序,求有多少种情况

很容易想到的是dfs的做法(就不再过多去说了

这次(看到题解后)稍微总结一下一种数论的做法 卡特兰数

用f[i]记录当前出栈i个数可能出现的情况。

对于x我们假设它是最后出栈的那个,则已经出栈的有比x大或者比x小两种情况

比x小的数有x-1个,所以这些数的全部出栈可能为f[x-1]

比x大的数有n-x个,所以这些数的全部出栈可能为f[n-x]

综合上面,共有f[x-1] * f[n-x]种情况

在x选取n种取值时所有方案ans = f[0]f[n-1] + f[1]f[n-2] + ... + f[n-1]*f[0];

然后递推去求解就可以了x

//玄学卡特兰数
#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
int n,ans;
int a[100000];
int main(){
    cin >> n;
    a[0] = a[1] = 1;
    for (int i = 2; i <= n; i++)
    {
        for (int j = 1; j <= i; j++)
        {
            a[i] += a[j-1]*a[i-j];
        }
    }
    cout<< a[n];
    
}
posted @ 2020-04-25 16:31  蕙心心w  阅读(192)  评论(0编辑  收藏  举报