洛谷P1754 球迷購票問題 題解

2022-01-11 18:20:45 字數 1093 閱讀 2666

卡特蘭數經典 \(\texttt\) 分拆問題。

分析:

題意相當於排列 \(n\) 個 \(\texttt a\) 和 \(n\) 個 \(\texttt b\),使得相鄰 \(\texttt\)(有序!)消掉,然後左右元素並到一起再消,最後消完的序列個數。

設 \(\texttt\) 為乙個組「1」,\(\texttt\) 自巢狀一次為乙個組「2」(即 \(\texttt\)),以此類推。

後面大多數數字指組「數字」

題意即轉換為乙個數 \(n\),求 \(n\) 分解成若干個正整數之和的方案數。

神犇到這一步就可以切掉了吧。

我們這裡考慮隔板法:

兩個 \(1\) 當然可以合併 \(2\)(\(=1+1\)),\(a\) 和 \(b\) 當然可以合併 \(a+b\),問題轉換為有 \(n\) 個 \(1\) 有多少種合併方案。

設 \(n\) 個數的方案數為 \(f(n)\)。

考慮將 \(f(n)\) 分解為 \(f(x_0+y_0)\)。

使用隔板:

於是得出遞推式:

\[f(n)=f(0)f(n-1)+f(1)f(n-2)+f(2)f(n-3)+\dots+f(i)f(n-i-1)+\dots+f(n-1)f(0)

\]樸素 dp 即可:

#includeusing namespace std;

const int n=25;

typedef long long ll;

ll n,dp[n];

int main()

{ cin>>n;

dp[0]=1;

for (int i=1;i<=n;i++)

for (int j=1;j<=n;j++)

dp[i]+=dp[j-1]*dp[i-j];

cout《但是在深入一步,會發現 \(f(n)=f(0)f(n-1)+f(1)f(n-2)+f(2)f(n-3)+\dots+f(i)f(n-i-1)+\dots+f(n-1)f(0)\) 的這個 \(f(n)\) 正好就是卡特蘭數 \(c_n\),這個公式正好是乙個卡特蘭數的遞推式。

洛谷 P1754 球迷購票問題

盛況空前的足球賽即將舉行。球賽門票售票處排起了球迷購票長龍。按售票處規定,每位購票者限購一張門票,且每張票售價為50元。在排成長龍的球迷中有n個人手持面值50元的錢幣,另有n個人手持面值100元的錢幣。假設售票處在開始售票時沒有零錢。試問這2n個球迷有多少種排隊方式可使售票處不致出現找不出錢的尷尬局...

P1754 球迷購票問題

原題鏈結 乙個長度為 2n 的括號序列由 n 個左括號和 n 個右括號組成,問有多少種合法方案 顯然對於任意時刻,要是能找開 b,那麼之前一定有乙個 a 給他提供了一張 50 的 money,如果將 a 看做是乙個左括號,將 b 看做是乙個右括號,那麼這道題就轉化成了 求合法括號序列的方案數 相信對...

P1754球迷購票問題

這是一道動態規劃題,其實也是個數論題。有n人拿50,有n人拿100買票,必須讓50元的人買,不然無法找零錢,問最多有幾種方案可以每一次都買票成功。這個題首先令人想到搜尋,但是隨即發現dp是正解,於是dp i j 代表當50為i,100為j人時 最大的方案數,於是去推導方程,得到dp i j dp i...