nyoj 980 格仔刷油漆

2021-06-20 23:44:24 字數 1309 閱讀 3408

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:3 描述

x國的一段古城牆的頂端可以看成 2*n個格仔組成的矩形(如下圖所示),現需要把這些格仔刷上保護漆。

你可以從任意乙個格仔刷起,刷完一格,可以移動到和它相鄰的格仔(對角相鄰也算數),但不能移動到較遠的格仔(因為油漆未乾不能踩!)

比如:a d b c e f 就是合格的刷漆順序。

c e f d a b 是另一種合適的方案。

當已知 n 時,求總的方案數。當n較大時,結果會迅速增大,請把結果對 1000000007 (十億零七) 取模。

輸入

輸入資料為乙個正整數(不大於1000)

輸出輸出資料為乙個正整數。

樣例輸入

2

322

樣例輸出

24

96359635897

說這道題目是一道dp題目。 不如說這是一道數學題目。

遞推公式比較複雜

一共有兩個遞推陣列:

首先設dn表示從左邊或者右邊的某個角出發,然後走遍所有格仔回到同一列有多少種方法。

明顯d1=2,dn=2*dn-1

所以dn=2^n

然後設an表示從某個角出發,走遍所有格仔(不一定回到同一列)有多少種方法。

an=dn+2*an-1+4*an-2

這個遞推公式就用統計原理分析出來,分別對應三種不同的走法

dn對應從這個角走到下一列,然後走遍所有格仔回到下一列,再回到這列的走法

2*an-1表示直接走到這列的另乙個角,然後再走其他的地方

4*an-2表示走對角線方法走遍前兩列,然後走其他的地方

這樣答案如果從四個角出發,總數就是4*an

然後分析從某一列開始,假設第i列(1

#include long long a[1001]= ,b[1001]=;

const int num=1000000007;

int main()

{ int i,n;

while(~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;

long long sum=4*a[n];

for (i=2; i

NYOJ 980 格仔刷油漆 動態規劃

這道題目狀態轉移方程比較複雜,剛開始以為沒這麼多情況,看了好多大牛的部落格再加上與同學討論才看懂,寫下心得。因為起點不固定,所以我們乙個乙個來考慮,先從角上考慮,設三個陣列來表示分別為d,a,sum,分別表示為 從乙個角開始然後回到同一列的對應位置的總個數 從乙個角開始的總個數 包括回到對應位置和不...

1347 例4 8 格仔遊戲

alice和bob玩了乙個古老的遊戲 首先畫乙個n n的點陣 下圖n 3 接著,他們兩個輪流在相鄰的點之間畫上紅邊和藍邊 直到圍成乙個封閉的圈 面積不必為1 為止,封圈 的那個人就是贏家。因為棋盤實在是太大了 n 200 他們的遊戲實在是太長了!他們甚至在遊戲中都不知道誰贏得了遊戲。於是請你寫乙個程...

2013 格仔刷油漆 dp

a表示在2 n的格仔,從四個頂點中任意乙個格仔出發遍歷全部格仔的種類數,a 1 1a 2 6 畫出所有情況 b表示在2 n的格仔,從任意乙個格仔出發,遍歷所有格仔且終點在出發點這一列,以為要回來,所有每一步只能一直往左或者右走 這樣該列另乙個格仔就會留個回來時刷 所以每一步2中選擇,b i 2 b ...