• 【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];
        
    }
    
  • 相关阅读:
    fibnacci数列(斐波那契数列)在python中实现
    《信息安全专业导论》第5周学习总结
    自我介绍
    python模拟进程状态
    俄罗斯方块游戏
    小学四则运算编程实践
    熟悉编程语言
    第六周学习总结
    第五周学习总结
    20201318第四周总结
  • 原文地址:https://www.cnblogs.com/huixinxinw/p/12773621.html
Copyright © 2020-2023  润新知