歷屆試題 格仔刷油漆
問題描述
x國的一段古城牆的頂端可以看成 2*n個格仔組成的矩形(如下圖所示),現需要把這些格仔刷上保護漆。
你可以從任意乙個格仔刷起,刷完一格,可以移動到和它相鄰的格仔(對角相鄰也算數),但不能移動到較遠的格仔(因為油漆未乾不能踩!)
比如:a d b c e f 就是合格的刷漆順序。
c e f d a b 是另一種合適的方案。
當已知 n 時,求總的方案數。當n較大時,結果會迅速增大,請把結果對 1000000007 (十億零七) 取模。
輸入格式
輸入資料為乙個正整數(不大於1000)
輸出格式
輸出資料為乙個正整數。
樣例輸入
2樣例輸出
24樣例輸入
3樣例輸出
96樣例輸入
22樣例輸出
359635897
思路:畢竟是決賽題,難度是很大的(對我來說),看了這位博主的思路,才發現規律真的很奇妙,導航門
1構造陣列a[x]、b[x]。a[x]表示在2 * x的格仔條件下,從四個角任意乙個角的格仔出發,遍歷全體格仔的方法總數,b[x]表示在2 * x的條件下,從四個角任意乙個角的格仔出發,遍歷全體格仔後回到與之相對的格仔中的方法總數。
顯然,a[1]=1,b[1]=1。
遞推式:
a[x]=
b[x]=b[x-1] * 2
推導如下:
先考慮出發點在角上,從乙個角出發,只有3種可能性。
(1)先去同一列相鄰的格仔,然後前往下一列,這就簡化成從2 * (x-1)的格仔中,從乙個角出發,遍歷全體格仔的 問題。因為前往下一列有兩種選法,所以有2 * a[x-1]種方法。
(2)先去相鄰列的同一行的格仔。又分為:
先去左下角,再去右邊部分, a[x-2] * 2種方法
先遍歷右邊的所有,再回來左下角,b[x-1]種方法
(3)先去右下角的格仔,又分為:
先去左邊格仔,再遍歷右邊,a[x-2] * 2種方法
先遍歷右邊,再去左邊,b[x-1]種方法
整理可得
a[x]=a[x-1] * 2+a[x-2] * 4+b[x-1] * 2
b[x]=2 * b[x-1]
而從中間某列的一點(2種選擇)出發時,顯然不能直接往下走,否則無法遍歷所有的點,應當先遍歷左邊(右邊)左右的點,然後回到相對的點,再遍歷右邊(左邊)的點。假設從第i列出發,出發的點有兩種選擇,第二步也有兩種選擇,因此所有的走法有2 * (b[i-1] * 2 * 2 * a[n-i]+ 2 * b[n-i] * 2 * a[i-1])種。加法的前一半時先遍歷左邊,後一半是先遍歷右邊。
於是,總數就是4 * a[x]+σ(2到n-1)2 * (b[i-1] * 2 * 2 * a[n-i]+ 2 * b[n-i] * 2 * a[i-1])
**方面注意對取餘的處理就行了
1 #include23using
namespace
std;45
intmain()619
for(int i=3;i<=x;i++)
23long
long
int sum=0
;24 sum=4*a[x];
25for(int i=2;i<=x-1;i++)
29if(x==1) sum=2
;30 cout <
31return0;
32 }
藍橋杯 歷屆試題 格仔刷油漆
歷屆試題 格仔刷油漆 時間限制 1.0s 記憶體限制 256.0mb 問題描述 x國的一段古城牆的頂端可以看成 2 n個格仔組成的矩形 如下圖所示 現需要把這些格仔刷上保護漆。你可以從任意乙個格仔刷起,刷完一格,可以移動到和它相鄰的格仔 對角相鄰也算數 但不能移動到較遠的格仔 因為油漆未乾不能踩!比...
歷屆試題 格仔刷油漆 動態規劃)
歷屆試題 格仔刷油漆 時間限制 1.0s 記憶體限制 256.0mb 問題描述 x國的一段古城牆的頂端可以看成 2 n個格仔組成的矩形 如下圖所示 現需要把這些格仔刷上保護漆。你可以從任意乙個格仔刷起,刷完一格,可以移動到和它相鄰的格仔 對角相鄰也算數 但不能移動到較遠的格仔 因為油漆未乾不能踩!比...
格仔刷油漆
x國的一段古城牆的頂端可以看成 2 n個格仔組成的矩形 如圖1所示 現需要把這些格仔刷上保護漆。你可以從任意乙個格仔刷起,刷完一格,可以移動到和它相鄰的格仔 對角相鄰也算數 但不能移動到較遠的格仔 因為油漆未乾不能踩!比如 a d b c e f 就是合格的刷漆順序。c e f d a b 是另一種...