不太想發到洛谷討論區,就往這裡放了。
我覺得現有的題解都沒說明白為什麼本題的狀態和轉移能覆蓋所有情況,並且感覺也非常不自然,沒見過的話感覺挺難發現這麼一個東西。
然而這個 dp 其實是可以自然地推匯出來的。
首先發現這個過程非常難以描述,主要原因在於很難刻畫一個局面。然而,如果知道一個局面是什麼樣的,轉移是簡單的。
因此我們考慮 時光倒流,直接考慮最後一次操作,這時的局面非常簡單:一定是刪掉全部的數。
然後考慮這次操作在原序列上的表現:選定若干個字元相等的位置 \(s_1,s_2,\dots,s_k\),分割出來若干段形如 \((s_i,s_{i+1})\) 這樣的區間,因為我們是倒著操作的,所以這些分割出來的區間不會再有交集,直接做下去就好了。
為了轉移,我們定義輔助陣列 \(g(l,r,k)\):表示我們選了 \(k\) 個位置留作最後操作的最大價值。轉移並不困難,然後再得到 \(f(l,r)\) 即可。
發現這個東西其實和 [THUSC 2016] 成績單 描述的 dp 是很類似的。
回過頭來看一看我們幹了一件什麼事,因為刪掉 \((s_i,s_{i+1})\) 這樣的區間的順序並不重要,我們可以這樣從右往左考慮這個過程:
- 保留一個位置,並刪掉和前一個保留的位置之間的區間。要求保留的位置上的字元相同。
這個 保留的位置 就是 luogu 題解裡面的 \(f(l,r,k)\) 中 \(k\) 的含義,當然也有一點不同:允許過程中把這個 \(k\) 清空。
直接正著想的話可能也能感受到這個過程,但畢竟不怎麼自然啊。
所以這種過程性較強的題目,從最終局面出發始終可以作為一種選擇。