B
好題。
這題其實是原題,在大工VS遼實的T3裡出現過,基本是一摸一樣。
對於觀看這個題解呢,我的理解是把兩個結合起來觀看,分別是 這個和這個,結合起來看的話無論是從感官還是從方便理解來看都很舒服。
好了,接下來我們說一下這個題的思路。
你考慮,你在一段長度為\(m\)的區間裡至少要選兩個,最終要求結果最小,所以一段長度為\(m\)要選兩個。
我們欽定狀態\(dp_{i,j}\)表示最後選的湯圓的下標為\(i\),倒數第二個選的是\(j\)
你考慮怎麼轉移這個東西,顯然得到一段公式:
那麼你考慮這玩意怎麼做最佳化,因為這個做法顯然是\(O(n^3)\)的。
你考慮,對於\(dp_{i,j}\),他需要比較的是\(dp_{j,i-m+1}\to dp_{j,j-1}\);對於\(dp_{i+1,j}\),他需要比較的是\(dp_{j,i-m} \to dp_{j,j-1}\),欸,這個時候你會驚奇的發現,對於\(dp_{j,i-m+1} \to dp_{j,j-1}\)這一段,他的列舉是冗餘的,這張圖片會更好理解:
這就是最佳化的地方,你考慮,我記錄一個\(res\),表示當前上端區間的最小值,而這段區間的最小值,其實就是\(min(res,dp_{j,i-m})\),那麼就可以把列舉\(k\)這個步驟給省略了!
這個時候再明確一下列舉順序就可以了!
你考慮,在求這個位置的最小值的時候,需要跟他前面的進行比較,所以,\(j\)需要從小到大進行列舉:for(int j = 1;j <= n;j++)
但是你考慮,對於列舉最小值的時候,他跟\(01\)揹包的過程是類似的,如果你正著列舉的話,你有可能會重複,而且這玩意是一個類似滑動視窗的東西,所以你要倒著掃。
記得初始化並且取模!直接就滾動陣列就可以解決這個題了。
D
先給幾個前置知識:
- 快速計算斐波那契數列的通項公式:$$\sum_{i=1}^{n}F_i = F_{n+2}-1$$
接下來我們給出證明。
首先明確一個東西----數學歸納法:當一個等式在\(m\)下成立,推導過後\(m+1\)也成立,則該等式成立(注意,前提是在\(1\)的情況下他也成立)
那麼就好整了,當\(n = 1\)時這個式子顯然是成立的,\(2-1 = 1\),
那麼引出有關\(m+1\)的等式:
\(\;\;\;\;\;\;\;\)由結論:
\(\;\;\;\;\;\;\;\)得到:
\(\;\;\;\;\;\;\)則該式子在\(m+1\)與\(1\)下均成立,故此式子成立。
- 有關小球與盒子的公式:
\(\;\;\;\;\;\;\)這個還是挺好理解的,前面那個是有\(n\)個不同小球放入\(m\)個不同盒子中,每個盒子可以為空。
\(\;\;\;\;\;\;\)後面那個\(S(n,i)\)就是斯特林數,他的意思就是從\(n\)個不同的小球放入\(m\)個相同的盒子,盒子不可以為空。那麼意思就顯然了
接下來我們把原來的式子推一下:
那麼這個時候怎麼算呢,你考慮,\(\sum_{l=0}^{i}\)時\(S(K,i-l)\frac{L!}{l!}\)與\(S(K,l)\frac{L!}{(i-l)!}\)的結果顯然時相同的,\(\sum_{j=0}^{L}S(i,L-j)\frac{i!}{j!}與\sum_{j=0}^{L}S(i,j)\frac{i!}{(L-j)!}\)相同,所以原式可以變化為:
這個時候你發現\(\frac{L!}{(i-l)!}\)和組合數是不是挺像的?
(組合數公式:\(C_{n}^{m} =\frac{n!}{m!(n-m)!}\))
是不是其實就是\(C_{i}^{l}\times l!\)?
另一個\(\frac{i!}{(L-j)!}\)同理。
故原式轉換為:
那麼這個時候你和前面那個前置知識\(2\)對比一下,發現式子可以轉換為:
其中\(S(n,m)\)為斯特林數,\(L\)為\(F_{n+2}-1\)
至此,我們便可以得到了這個題的\(30pts\)做法,我已經盡力了。