歷屆試題 格仔刷油漆

2022-02-23 05:07:40 字數 1965 閱讀 4592

歷屆試題 格仔刷油漆  

問題描述

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 #include2

3using

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 是另一種...