zoukankan      html  css  js  c++  java
  • 【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];
        
    }
    
  • 相关阅读:
    转:Jenkins自动化部署入门详细教程
    详解MySQL锁
    常见的内存溢出与解决办法
    read IEEE Standard for verilog(1)
    verilog之状态机
    quantus18的signaltap逻辑分析仪
    英语文档之关键词统计
    cadence软件画版图操作
    英语文档之vivado界面
    verilog之wire和reg
  • 原文地址:https://www.cnblogs.com/huixinxinw/p/12773621.html
Copyright © 2011-2022 走看看