《WRC10 》釋出11月更新預告片 新增新貼紙賽車等
阿新 • • 發佈:2021-11-26
“我經常有那種感覺,如果這個事情來了,你卻沒有勇敢地去解決掉,它一定會再來。生活真是這樣,它會一次次地讓你去做這個功課直到你學會為止。” —— 《像我這樣笨拙地生活》
卡特蘭數(Catalan number)是組合數學中一個常出現在各種計數問題中的數列。
數列的前幾項為:1,1, 2, 5, 14, 42, 132, 429, 1430, 4862,...
題目描述:
n 個元素進棧序列為:1,2,3,4,...,n,則有多少種出棧序列。
思路:
我們將進棧表示為 +1,出棧表示為 -1,則 1 3 2 的出棧序列可以表示為:+1 -1 +1 +1 -1 -1。
假設非法序列為 A,對應的序列為 B。每個 A 只有一個"第一個字首和小於 0 的字首",所以每個 A 只能產生一個 B。而每個 B 想要還原到 A,就需要找到"第一個字首和大於 0 的字首",顯然 B 也只能產生一個 A。
#include <cstdio> using namespace std; long long catalan[1000005]; int main() { int n; scanf("%d", &n); catalan[0] = catalan[1] = 1; for (int i = 2; i <= n; i++) for (int j = 0; j <= i - 1; j++) catalan[i] += catalan[j] * catalan[i - j - 1]; printf("%lld\n", catalan[n]); return 0; }
我有罪,從此與省二失之交臂。這一次就是在賽場上沒認出來。關於括號的排列組合,在使勁想轉移方程,卡了3h。