洛谷 P1754 球迷購票問題

2022-04-05 03:33:27 字數 1222 閱讀 4016

盛況空前的足球賽即將舉行。球賽門票售票處排起了球迷購票長龍。

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

例如當n=2是,用a表示手持50元面值的球迷,用b表示手持100元錢的球迷。則最多可以得到以下兩組不同的排隊方式,使售票員不至於找不出錢。

第一種:a a b b

第二種:a b a b

[程式設計任務]

對於給定的n (0≤n≤20),計算2n個球迷有多少種排隊方式,可以使售票處不至於找不出錢。

輸入格式:

乙個整數,代表n的值

輸出格式:

乙個整數,表示方案數

輸入樣例#1: 複製

2

輸出樣例#1: 複製

2

必開qword

測試:n=15

回溯:1秒(超時)

模擬棧:大於10分鐘

遞迴演算法:1秒(超時)

動態規劃:0 ms

組合演算法:16 ms

思路:一:卡特蘭數

#include#include

#include

#include

using

namespace

std;

intn;

long

long f[10000

];int

main()

二:動態規劃。f[i][j]表示已經收了i個人的錢,現在手裡有j張50的。

那 當現在收的人的錢是50元時 f[i][j]+=f[i-1][j-1]。因為多一張50的,所以現在50元比起原來就多了一張。

當現在收的人的錢是100元時  f[i][j]+=f[i-1][j+1

]。因為要找一張50的,所以比起原來就少了一張50的。

#include#include

#include

#include

using

namespace

std;

intn;

int f[42][42

];int

main()

cout

<2*n][0

];}

洛谷P1754 球迷購票問題 題解

卡特蘭數經典 texttt 分拆問題。分析 題意相當於排列 n 個 texttt a 和 n 個 texttt b 使得相鄰 texttt 有序!消掉,然後左右元素並到一起再消,最後消完的序列個數。設 texttt 為乙個組 1 texttt 自巢狀一次為乙個組 2 即 texttt 以此類推。後面...

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...