格仔刷油漆
x國的一段古城牆的頂端可以看成 2*n個格仔組成的矩形(如圖1所示),現需要把這些格仔刷上保護漆。
你可以從任意乙個格仔刷起,刷完一格,可以移動到和它相鄰的格仔(對角相鄰也算數),但不能移動到較遠的格仔(因為油漆未乾不能踩!)
比如:a d b c e f 就是合格的刷漆順序。
c e f d a b 是另一種合適的方案。
當已知 n 時,求總的方案數。當n較大時,結果會迅速增大,請把結果對 1000000007 (十億零七) 取模。
輸入資料為乙個正整數(不大於1000)
輸出資料為乙個正整數。
例如:使用者輸入:
2程式應該輸出:
24再例如:
使用者輸入:
3程式應該輸出:
96再例如:
使用者輸入:
22程式應該輸出:
359635897
資源約定:
峰值記憶體消耗 < 64m
cpu消耗 < 1000ms
請嚴格按要求輸出,不要畫蛇添足地列印類似:「請您輸入...」 的多餘內容。
所有**放在同乙個原始檔中,除錯通過後,拷貝提交該原始碼。
注意: main函式需要返回0
注意: 只使用ansi c/ansi c++ 標準,不要呼叫依賴於編譯環境或作業系統的特殊函式。
注意: 所有依賴的函式必須明確地在原始檔中 #include , 不能通過工程設定而省略常用標頭檔案。
提交時,注意選擇所期望的編譯器型別(千萬不要混淆c和cpp)。
思路:名詞解釋相對的格仔:一列之中,除了指定格仔之外的另乙個格仔。
1、構造兩個動態規劃陣列和乙個計數器sum,乙個陣列a[x],表示在2*x的格仔條件下,從最邊緣一列的乙個角的格仔出發,遍歷全體格仔的種類數,顯然a[1]=1,另乙個陣列b[x],表示在2*x的格仔條件下,從乙個角的格仔出發,遍歷全體格仔後回到與之相對的格仔的種類數。如圖所示,顯然因為要考慮到回來的路徑,因此除了出發點之外,每一列都只有2種選擇方法,因此b[x]=2*b[x-1]
2、先考慮出發點在角上的問題,從乙個角出發,只有3種可能性,(1)那就是先去相對的格仔,然後前往下一列,這就簡化成為從2*x-1列的格仔中,從乙個角出發遍歷所有格仔的問題,因為前往下一列的第乙個格仔有兩種選法,因此a[x]+=2*a[x-1];(2)第二種可能性就是先去遍歷其餘格仔,最後以相對的格仔收尾。此時a[x]+= b[x];(3)第三種可能性較為複雜,先經過第二列的一次轉折,然後到第三列的乙個角上進行遍歷。此時第二列有2種選法,第三列有2種選法,因此a[x]+=4*a[x-2];
3、再去考慮出發點在中間的問題,如圖所示,出發點在中間的時候,顯然不能直接往下走,否則無法遍歷所有點,應當是先遍歷左邊(右邊)所有點,然後回到相對的點,然後遍歷右邊(左邊)的點。注意先遍歷的時候,必須是採用「遍歷全體格仔後回到與之相對的格仔」的走法,否則無法遍歷出發點正下方的點,而後遍歷則不受限制。因此設從第i列開始出發,出發點有兩種選法,第一落腳點又有兩種走法,後遍歷的第一落腳點又有兩種走法,走完總走法數為2*(2*b[i-1]*2*a[n-i])+2*(2*b[n-i]*2*a[i-1]) (加法的前一半是先遍歷左邊,後一半是先遍歷右邊)
4、總走法數就是4*a[i](因為有4個角)+ 從2到第n-1列所有從中間走法數的和。
下面是**(vc6.0)編譯通過。時間複雜度為o[n]
#include __int64 a[1001]=;
__int64 b[1001]=;
const int num=1000000007;
int main()
{ int i,n;
scanf("%d",&n);
b[1]=1;
for (i=2;i<=n;i++)
b[i]=(b[i-1]*2%num);
a[1]=1;a[2]=6;
for (i=3;i<=n;i++)
a[i]=(2*a[i-1]+b[i]+4*a[i-2])%num;
__int64 sum=4*a[n];
for (i=2;i
格仔刷油漆(dp)
格仔刷油漆 x國的一段古城牆的頂端可以看成 2 n個格仔組成的矩形 如圖1所示 現需要把這些格仔刷上保護漆。你可以從任意乙個格仔刷起,刷完一格,可以移動到和它相鄰的格仔 對角相鄰也算數 但不能移動到較遠的格仔 因為油漆未乾不能踩!比如 a d b c e f 就是合格的刷漆順序。c e f d a ...
格仔刷油漆
x國的一段古城牆的頂端可以看成 2 n個格仔組成的矩形 如圖1所示 現需要把這些格仔刷上保護漆。你可以從任意乙個格仔刷起,刷完一格,可以移動到和它相鄰的格仔 對角相鄰也算數 但不能移動到較遠的格仔 因為油漆未乾不能踩!比如 a d b c e f 就是合格的刷漆順序。c e f d a b 是另一種...
格仔刷油漆
題目 格仔刷油漆 題意 要遍歷2行n列的格仔,一次只能遍歷四周,遍歷過就不能再遍歷,問有多少種遍歷方法 起點也任意,只要能遍歷完所有格仔就可以 思路 分兩大塊 1.從某乙個角落出發 a n 比如從a點出發,因為要遍歷所有的格仔,所以要想遍歷同一列的d,就只有三種方法 1.直接到d,然後再遍歷bcef...