【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];
}