給定乙個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
1cn
−2+
...+
cn−2
c1
+cn−
1c0
這就是卡塔蘭數定義
從小到大打表即可
這個過程和括號配對種數問題,棧出列種數問題是等價的,在尋找和末尾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格中紅色算籌個數大於等於黑色算...