洛谷 P1044 [NOIP2003 普及组] 栈 题解
1.CSP-S 2023 T1 题解2.洛谷 P9680 string[_view] 题解3.洛谷 U388010 题解
4.洛谷 P1044 [NOIP2003 普及组] 栈 题解
5.P9713 「QFOI R1」抱抱 题解洛谷 P1044 [NOIP2003 普及组] 栈 题解
Sol
本题通过分析可得:
假设现在进行 次操作,我们把 push 认为是在地图上向右走,pop 向上走,那么其中一个合法的步骤可以是( 代表 push, 代表 pop):。
而且我们发现,他最终会走到 的位置,且如果这个序列是一个合法序列(pushpop 串的任意前缀 的个数 的个数)它能在走的过程中保证会在 ,, 这三个点围成的三角形内走动。
我们可以推出结果就是能走到 的总数 非法个数,也就是 。
表示走 步然后走到点 ,共选取了 步往右走。
表示走 步然后走到点 ,共选取了 步往右走。
接下来就可以化简了。
我们还可以推出:
那么代码就一呼而出了。
Code
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <stack>
using namespace std;
using ll = long long;
const int kMaxN = 110, kInf = (((1 << 30) - 1) << 1) + 1;
const ll kLInf = 9.22e18;
int n, f[kMaxN];
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n;
f[0] = 1, f[1] = 1;
for (int i = 2; i <= n; ++ i) {
for (int j = 0; j < i; ++ j) {
f[i] += f[j] * f[i - j - 1];
}
}
cout << f[n] << '\n';
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】