M04077: 出栈序列统计
dp, dfs, math, http://cs101.openjudge.cn/practice/04077/
【黄宇曦 地球与空间科学学院】思路:直接思考 dp。考虑第一个在什么时候被弹出不难发现转移方程。事实上这也是所谓的 Catalan 数。
cpp
#include <bits/stdc++.h>
using namespace std;
#define all(x) begin(x), end(x)
#define sz(x) (int) (x).size()
using i64 = long long;
using u64 = unsigned long long;
using i128 = __int128_t;
using u128 = __uint128_t;
using pii = pair<int, int>;
using vi = vector<int>;
using usi = unordered_set<int>;
int main() {
cin.tie(nullptr)->sync_with_stdio(false);
int n;
cin >> n;
vi dp(n + 1, 0);
dp[0] = dp[1] = 1;
for (int i = 2; i <= n; i++) {
for (int j = 0; j < i; j++) {
dp[i] += dp[j] * dp[i - 1 - j];
}
}
cout << dp[n] << '\n';
return 0;
}【张真铭 元培】思路:Catalan数
路径计数问题:有一个大小为
圆内不相交弦计数问题:圆上有
三角剖分计数问题:对角线不相交的情况下,将一个凸
二叉树计数问题:含有
括号序列计数问题:由
出栈序列计数问题:一个栈(无穷大)的进栈序列为
数列计数问题:由
代码:
cpp
#include <iostream>
auto main() -> int {
std::cin.tie(nullptr)->sync_with_stdio(false);
int n;
std::cin >> n;
int c_prev = 1;
int c_curr = 1;
for (int i = 1; i <= n; ++i) {
c_prev = c_curr;
c_curr = (4 * i - 2) * c_prev / (i + 1);
}
std::cout << c_curr << '\n';
}