藍橋,格仔塗油漆

2022-03-16 17:20:00 字數 3119 閱讀 3090

2019/10/21,發現了這題的乙個線性遞推式,不過不會證明。f(

n)=6

∗f(n

−1)−

8∗f(

n−2)

−8∗f

(n−3

)+16∗

f(n−

4)'>f(n)=6∗f(n−1)−8∗f(n−2)−8∗f(n−3)+16∗f(n−4)

題目描述:

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

可以看出來這是一類dp題,然而遞推式一直無從下手,感覺狀態多樣,看了網上的題解才有了思路。首先四個頂點肯定是對稱的,並且以它們為起點,對終點沒有要求。那麼在中間呢,就像下圖的3為起點的話,那麼第一步肯定不能走向7,不然就從中間截斷了無法塗完所有格仔。我們讓它一開始是往左邊走,那麼如果它是走到2,那麼左邊的的塗完的終點就應該是6,反之就是先走到6,最後左邊塗完的終點是2。

然後就是2或者6走到7,這時就相當於左邊已經塗完了,7可以走向4或者8,這時對於右邊的終點就沒有要求了只要是合理的塗法就行。

從3走到2或6塗左邊的,從7走到4或8塗右邊,它們的方案可以總結為兩種,一種是以頂點為起點,終點在同一列的方案,另一種就是以頂點為起點,終點任意的方案,所以我們用陣列a代表第一種方案,陣列b代表第二種方案,那麼a[i]就是以乙個頂點為起點塗完2*i個格仔,終點在起點的同一列的方案,b[i]就是以乙個頂點為起點塗完2*i個格仔,終點任意的方案。那麼從第二列開始到第n-1列中間的列為起點的方案就是

先走左邊的方案li=2*a[i-1]*2*b[n-i]先走右邊的方案ri=2*b[i-1]*2*a[n-i]方案就是ci=(li+ri)*2(就比如上圖的第3列為起點,左邊就剩下i-1列,右邊剩下n-i列,從3開始,先走左邊的話,3可以走到2和6,所以左邊塗完就是2*a[i-1],然後7可以走到4和8所以右邊塗完就是2*b[n-i],左右方案相乘就是這種情況的方案。然後從3開始,也可以先走右邊,還有就是也可以從7開始,所以這一列為起點的方案就是(li+ri)*2),

那麼中間所以列的方案就是c2+c3+...+cn-1

那麼塗完2*n個格仔的方案就是4*a[n]+c2+c3+cn-1(1要特判,因為1列沒有4個頂點)

關鍵在於a陣列和b陣列怎麼得到呢?

a[i]代表的是以乙個頂點為起點塗完2*i個格仔,終點在起點的同一列的方案,我們以下圖為例,假設1是起點,那麼5就是終點。一開始1可以走到2和6,如果是走到2,那麼2又可以走到3和7,但不能走到6,因為要留下6來走回到5,不然就截斷了,對於後面的各列也是同理

所以就是除了最後一列,每一列有兩種方案。也就可以得到a[i]=2i-1

然後b[i]代表的是以乙個頂點為起點塗完2*i個格仔,終點任意的方案。我們以1為起點的話,它有3種前進的選擇2,5,6,那麼如果先讓1走到5的話,5就可以走到2和6,除去1和5的話,2和6可以視為i-1列的頂點,並且他們為起點終點沒有限制

那麼這種情況的方案就是2*b[i-1]

然後如果是1先走到下一列也就是2到6的話,

如果終點是5的話,那麼這種情況的方案就是a[i]

如果終點不是5的話,那麼得先把5給塗掉,就有1,2,5,6,和1,6,5,2兩種方案,這時把1,2,5,6去掉,3和7可以視為i-2列的頂點,並且他們為起點終點沒有限制

而2和6都可以走到3和7,這種情況的方案就是2*2*b[i-2]

所以就是b

[i]=2*a[i-1]+b[i]+4*b[i-2]

加上取模和long long那麼這時答案就出來了。

1 #include2 typedef long

long

ll;3

const

int n=1108;4

const ll mod=1000000007

;5 ll b[n]=,a[n]=;

6int

main()7

19for(int i=3;i<=n;i++)

2026 ll ans=(b[n]<<2)%mod;

27for(int i=2;i)

2833 printf("

%lld\n

",ans);

34return0;

35 }

鋪完瓷磚塗格仔

藍橋杯 格仔刷油漆(dp)

歷屆試題格仔刷油漆 時間限制 1.0s 記憶體限制 256.0mb 問題描述 x 國的一段古城牆的頂端可以看成 2 n個格仔組成的矩形 如下圖所示 現需要把這些格仔刷上保護漆。你可以從任意乙個格仔刷起,刷完一格,可以移動到和它相鄰的格仔 對角相鄰也算數 但不能移動到較遠的格仔 因為油漆未乾不能踩!比...

格仔刷油漆

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...