時間限制:
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說這道題目是一道dp題目。 不如說這是一道數學題目。96359635897
遞推公式比較複雜
一共有兩個遞推陣列:
首先設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 ...