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}\)
所以 \(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\}\)。
所以最後的方程就是上面兩個式子綜合一下就好了。