2822 AHOI2012 樹屋階梯

2021-07-25 13:23:56 字數 2013 閱讀 6464

time limit: 1 sec  

memory limit: 128 mb

submit: 729  

solved: 424 [

submit][

status][

discuss]

暑假期間,小龍報名了乙個模擬野外生存作戰訓練班來鍛鍊體魄,訓練的第

乙個晚上,教官就給他們出了個難題。由於地上露營濕氣重,必須選擇在高處的

樹屋露營。小龍分配的樹屋建立在一顆高度為

n+1尺(

n為正整數)的大樹上,

正當他發愁怎麼爬上去的時候,發現旁邊堆滿了一些空心四方鋼材(如圖

1.1),

經過觀察和測量,這些鋼材截面的寬和高大小不一,但都是

1尺的整數倍,教官

命令隊員們每人選取

n個空心鋼材來搭建乙個總高度為

n尺的階梯來進入樹屋,

該階梯每一步台階的高度為

1尺,寬度也為

1尺。如果這些鋼材有各種尺寸,且

每種尺寸數量充足,那麼小龍可以有多少種搭建方法?(注:為了避免夜裡踏空,

鋼材空心的一面絕對不可以向上。)

以樹屋高度為

4尺、階梯高度

n=3尺為例,小龍一共有如圖

1.2所示的5種

搭 建方法:

乙個正整數

n(1≤n≤

500)

,表示階梯的高度

乙個正整數,表示搭建方法的個數。(注:搭建方法個數可能很大。) 3

51≤n

≤500

[submit][

status][

discuss]

令f[i]:構造出n級台階的方案數。顯然,有f[0] = 1,f[1] = 1,f[2] = 2,f[3] = 5

這恰好是卡特蘭數的前幾項,那麼後面也滿足這個規律麼???可以嘗試證明一下。

首先,用n塊鋼材構建n級台階,因為鋼材都是長方體,所以每級台階一定對應一塊鋼材

假設已經求好了i∈[1,n)的所有f[i],現在我們要求f[n],怎麼利用已知資訊?

假設要求f[n],可以列舉圖示中紅色的矩形鋼材,讓它強行塞一節台階

這樣下半部分是f[k],上半部分就是f[n-1-k]了,就有卡特蘭數遞推式,f[n] = ∑f[i]*f[n-i-1]

剩下就是高精度的事。。。壓位一下,,別寫炸了。。。。。

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int maxn = 505;

const int n = 55;

const ll mo = 1000000000;

struct data

data operator + (const data &b)

c.len = c.a[le]?le+1:le;

return c;

} data operator * (const data &b)

c.len = c.a[le-1]?le:le-1;

return c;

}}f[maxn];

int n;

void print(int x,int res)

print(x / 10,res - 1); printf("%d",x % 10);

}int main()

AHOI2012 BZOJ2822 樹屋階梯

description 暑假期間,小龍報名了乙個模擬野外生存作戰訓練班來鍛鍊體魄,訓練的第乙個晚上,教官就給他們出了個難題。由於地上露營濕氣重,必須選擇在高處的樹屋露營。小龍分配的樹屋建立在一顆高度為n 1尺 n為正整數 的大樹上,正當他發愁怎麼爬上去的時候,發現旁邊堆滿了一些空心四方鋼材 如圖1....

BZOJ2822 AHOI2012 樹屋階梯

設f i 表示i個階梯的方案數,考慮你第乙個踩上去的階梯,他的高度一定為1,可以取1 i的長度,若其長度為j,搭在這一塊上邊的部分的方案數為f j 1 不在上邊部分的方案與f i j 一一對應 砍掉最底下一行 於是就是卡特蘭數,質因數分解之後高精即可 include include include ...

BZOJ2822 AHOI2012 樹屋階梯

標籤 數學,卡特蘭數,高精度 description 暑假期間,小龍報名了乙個模擬野外生存作戰訓練班來鍛鍊體魄,訓練的第乙個晚上,教官就給他們出了個難題。由於地上露營濕氣重,必須選擇在高處的樹屋露營。小龍分配的樹屋建立在一顆高度為n 1尺 n為正整數 的大樹上,正當他發愁怎麼爬上去的時候,發現旁邊堆...