洛谷P1722 矩陣 (卡塔蘭數)

2021-10-02 09:18:56 字數 1347 閱讀 5048

給定乙個1*(2n)的矩陣。現讓你放入一樣多的紅色算籌和黑色算籌,使對於所有的i(1<=i<=2n),使第1~i格中紅色算籌個數大於等於黑色算籌

(同p1044棧)

記紅為r,黑為b,輸入n時的結果為cn

畫幾個之後,發現這個問題具有子結構。

如n-1的情況可以通過在後面補乙個rb構成n的情況。

但若要推導遞推公式,需要更確定的子結構劃分。

注意,不能通過刪去n情況的末尾兩個形成n-1的情況,因為不知道n-1內是不是恰好有n-1個r和b

如情況rrrrr...bbbbb(n個紅,n個黑),結果是cn,但刪去末尾兩個後得不到cn-1

注意到最末的格仔必為黑色,而且它前面未必是紅,所以在劃分的時候不應包含它。(完整的rb+完整的rb=完整的rb,完整的rb才可應用ci遞推)

現在序列中多餘了乙個紅色的元素,也不應包含(和末尾b配對的r)。這樣,剩下的部分就是完整部分。

配對rb列的種類數是ci ,其中i是列長度

這種r有n-1個可能存在的位置,即1 ~ n-1,不同的情況符合加法原理

前面的rb列長0時,後面rb列長n-1(實際長度為2倍,這裡說的是輸入為相應規模的子問題)

以此類推所以ans

=c0c

n−1+

c1cn

−2+.

..+c

n−2c

1+cn

−1c0

ans=c_0c_+c_1c_+...+c_c_1+c_c_0

ans=c0

​cn−

1​+c

1​cn

−2​+

...+

cn−2

​c1​

+cn−

1​c0

​這就是卡塔蘭數定義

從小到大打表即可

這個過程和括號配對種數問題,棧出列種數問題是等價的,在尋找和末尾b配對的r時就應當發現了。

#include

#include

using

namespace std;

int c[

105]

;int

main()

c[i]%=

100;

//分步取模

}int n;

cin >> n;

cout << c[n]

;return0;

}

洛谷P1722 矩陣 II(Catalan數)

usqwedf 改編系列題。如果你在百忙之中抽空看題,請自動跳到第六行。眾所周知,在中國古代算籌中,紅為正,黑為負 給定乙個1 2n 的矩陣 usqwedf 這不是乙個2n的佇列麼 現讓你自由地放入紅色算籌和黑色算籌,使矩陣平衡 即對於所有的i 1 i 2n 使第1 i格中紅色算籌個數大於等於黑色算...

洛谷P1722 矩陣 II

usqwedf 改編系列題。如果你在百忙之中抽空看題,請自動跳到第六行。眾所周知,在中國古代算籌中,紅為正,黑為負 給定乙個1 2n 的矩陣 usqwedf 這不是乙個2n的佇列麼 現讓你自由地放入紅色算籌和黑色算籌,使矩陣平衡 即對於所有的i 1 i 2n 使第1 i格中紅色算籌個數大於等於黑色算...

洛谷 P1722 矩陣 II

usqwedf 改編系列題。如果你在百忙之中抽空看題,請自動跳到第六行。眾所周知,在中國古代算籌中,紅為正,黑為負 給定乙個1 2n 的矩陣 usqwedf 這不是乙個2n的佇列麼 現讓你自由地放入紅色算籌和黑色算籌,使矩陣平衡 即對於所有的i 1 i 2n 使第1 i格中紅色算籌個數大於等於黑色算...