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),那麼塗完2*n個格仔的方案就是4*a[n]+c2+c3+cn-1(1要特判,因為1列沒有4個頂點)那麼中間所以列的方案就是c2+c3+...+cn-1
關鍵在於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...