1. 程式人生 > 其它 >CF710E Generate a String 題解

CF710E Generate a String 題解

一道比較不錯的 DP。

\(f_i\) 表示當前字串長為 \(i\) 時的最小代價,發現這道題麻煩的地方在於 \(f_i\) 可以從 \(f_{i+1}\) 的地方轉移過來。

分類討論一下:


\(i\) 為偶數:

\(i\) 為偶數時 \(f_i\) 能從 \(f_{i-1},f_{\frac{i}{2}},f_{i+1}\) 三個點轉移過來,但是 \(f_{i+1}\) 的轉移路程是 \(? \to f_{\frac{i+2}{2}} \to f_{i+2} \to f_{i+1} \to f_{i}\)
,總代價是 \(y+2x\),這顯然不如 \(? \to f_{\frac{i+2}{2}} \to f_{\frac{i}{2}} \to f_{i}\)

更優,總代價是 \(y+x\)

所以 \(i\) 為偶數的轉移方程是 \(f_{i}=\min\{f_{i-1}+x,f_{\frac{i}{2}}+y\}\)


\(i\) 為奇數:

\(i\) 為奇數時 \(f_i\) 能從 \(f_{i-1},f_{i+1}\) 轉移過來,接下來討論 \(f_{i+1}\) 的轉移思路。

顯然 \(f_{i+1}\) 不能從 \(f_{i}\) 轉移,於是只能從 \(f_{i+2},f_{\frac{i+1}{2}}\) 轉移,發現 \(f_{i+2}\) 又是個奇數,因此如果從 \(f_{i+2}\) 轉移的話路徑只能是這樣:

\(? \to f_{\frac{i+1}{2}} \to f_{\frac{i+3}{2}} \to f_{i+3} \to f_{i+2} \to f_{i+1} \to f_{i}\)

總代價是 \(4x+y\),顯然不如從 \(f_{i+1}\) 的轉移路徑 \(? \to f_{\frac{i+1}{2}} \to f_{i+1} \to f_{i}\),總代價是 \(y+x\)

所以 \(i\) 為奇數的轉移方程是 \(f_{i}=\min\{f_{i-1}+x,f_{\frac{i+1}{2}}+x+y\}\)


所以最後的方程就是上面兩個式子綜合一下就好了。

Code:GitHub CodeBase-of-Plozia CF710E Generate a String.cpp