2024/10/2 CSP-S模擬賽

Lunar_Whisper發表於2024-10-02

B

好題。
這題其實是原題,在大工VS遼實的T3裡出現過,基本是一摸一樣。
對於觀看這個題解呢,我的理解是把兩個結合起來觀看,分別是 這個這個,結合起來看的話無論是從感官還是從方便理解來看都很舒服。

好了,接下來我們說一下這個題的思路。
你考慮,你在一段長度為\(m\)的區間裡至少要選兩個,最終要求結果最小,所以一段長度為\(m\)要選兩個。

我們欽定狀態\(dp_{i,j}\)表示最後選的湯圓的下標為\(i\),倒數第二個選的是\(j\)
你考慮怎麼轉移這個東西,顯然得到一段公式:

\[dp_{i,j} = min(dp_{j,k})+a_i(i-m+1\le k \le j-1) \]

那麼你考慮這玩意怎麼做最佳化,因為這個做法顯然是\(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

先給幾個前置知識:

  1. 快速計算斐波那契數列的通項公式:$$\sum_{i=1}^{n}F_i = F_{n+2}-1$$
    接下來我們給出證明。
    首先明確一個東西----數學歸納法:當一個等式在\(m\)下成立,推導過後\(m+1\)也成立,則該等式成立(注意,前提是在\(1\)的情況下他也成立)

    那麼就好整了,當\(n = 1\)時這個式子顯然是成立的,\(2-1 = 1\)
    那麼引出有關\(m+1\)的等式:

\[\sum_{i=1}^{m+1} = \sum_{i=1}^{m}+F_{m+1} \]

\(\;\;\;\;\;\;\;\)由結論:

\[\sum_{i=1}^{n}F_i = F_{n+2}-1 \]

\(\;\;\;\;\;\;\;\)得到:

\[\begin{aligned} \sum_{i=1}^{m+1} &= \sum_{i=1}^{m}F_i+F_{m+1} \\ &= F_{m+2}+F_{m+1}-1\\ &=F_{m+3}-1 \end{aligned} \]

\(\;\;\;\;\;\;\)則該式子在\(m+1\)\(1\)下均成立,故此式子成立。

  1. 有關小球與盒子的公式:

\[ m^n = \sum_{i=1}^{m}S(n,i)C_{m}^{i} i! \]

\(\;\;\;\;\;\;\)這個還是挺好理解的,前面那個是有\(n\)個不同小球放入\(m\)個不同盒子中,每個盒子可以為空。
\(\;\;\;\;\;\;\)後面那個\(S(n,i)\)就是斯特林數,他的意思就是從\(n\)個不同的小球放入\(m\)個相同的盒子,盒子不可以為空。那麼意思就顯然了


接下來我們把原來的式子推一下:

\[\begin{aligned} &\sum_{i=1}^{n}(\sum_{m=1}^{r}F_i)!\times i! \times \sum_{l=0}^{i}\sum_{j=0}^{\sum_{t=1}^{r}F_t} \frac{S(K,i-l)}{l!} \frac{S(i,\sum_{w=1}^{r}F_w-j)}{j!} \\ =&\sum_{i=1}^{n}L! \times i! \times \sum_{l=0}^{i}\sum_{j=0}^{L}\frac{S(K,i-l)}{l!}\frac{S(i,L-j)}{j!} \\ =&\sum_{i=1}^{n}\sum_{l=0}^{i}S(K,i-l)\frac{i!}{l!}\sum_{j=0}^{L}S(i,L-j)\frac{L!}{j!} \end{aligned} \]

那麼這個時候怎麼算呢,你考慮,\(\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)!}\)相同,所以原式可以變化為:

\[\begin{aligned} &\sum_{i=1}^{n}\sum_{l=0}^{i}S(K,i-l)\frac{i!}{l!}\sum_{j=0}^{L}S(i,L-j)\frac{L!}{j!} \\ =&\sum_{i=1}^{n}\sum_{l=0}^{i}S(K,l)\frac{i!}{(i-l)!}\sum_{j=0}^{L}S(i,j)\frac{L!}{(L-j)!} \end{aligned} \]

這個時候你發現\(\frac{L!}{(i-l)!}\)和組合數是不是挺像的?
(組合數公式:\(C_{n}^{m} =\frac{n!}{m!(n-m)!}\))
是不是其實就是\(C_{i}^{l}\times l!\)?
另一個\(\frac{i!}{(L-j)!}\)同理。
故原式轉換為:

\[\begin{aligned} &\sum_{i=1}^{n}\sum_{l=0}^{i}S(K,l)\frac{i!}{(i-l)!}\sum_{j=0}^{L}S(i,j)\frac{L!}{(L-j)!} \\ =&\sum_{i=1}^{n}\sum_{l=0}^{i}S(K,l)C_{i}^{l}\times l!\sum_{j=0}^{L}S(i,j)C_{L}^{j}\times j! \end{aligned} \]

那麼這個時候你和前面那個前置知識\(2\)對比一下,發現式子可以轉換為:

\[\sum_{i=1}^{n}i^KL^i \]

其中\(S(n,m)\)為斯特林數,\(L\)\(F_{n+2}-1\)
至此,我們便可以得到了這個題的\(30pts\)做法,我已經盡力了。