1. 程式人生 > 其它 >Codeforces Round #744 (Div. 3) G題題解

Codeforces Round #744 (Div. 3) G題題解

淦,最後一道題沒寫出來,...還是我太菜了,不過這個題確實比較有趣.

G. Minimal Coverage

簡化題意:就是你處在座標軸的0點上,給你一個序列\(a_i\),每次你可以選擇向左走\(a_i\),也可以選擇向右走\(a_i\),求你走過的範圍的最小值?(第一步必須向右走)。
其實這個題想起來也沒那麼複雜,顯然每一步在選擇時,我們需要一下的資訊:當前所處的位置,當前走到哪一步了,當前所走過的範圍的左右邊界。資訊蠻多的,如果用DP的話,當前走到哪一步了,這個很好解決,剩下的三個資訊:當前的位置,走過的範圍。這個時候我們再看下資料範圍:\(n\leq 10^4,a_i\leq 1000\),這\(a_i\)

的範圍支援我們最多隻能再存一個資訊。遇到這種資訊多,我們無法儲存的時候,一般大的解決方法是觀察資訊之間有沒有關係,能不能通過推到得出另一個資訊來減少我們儲存的資訊量。但是:當前的位置,走過的範圍。好像沒什麼明顯的聯絡。剩下的辦法就是根據題目的性質,設計更優的狀態來減少我們需要記錄的資訊。可以思考最優解存在的性質,我們發現這個題起點是確定從零開始的,但其實我們完全可以自己調節起點的位置,這對題目沒有什麼影響。既然如此,我們可以將最優解的左端點移到原點,這樣它所有的移動就都是在整數的座標下移動了。那我們就規定0為左端點,之後考慮我們若在位置x,則右端點肯定越小越好。則我們設這樣的狀態f[i][j],即規定0為左端點時前i步後,當前點在j時的最小的右端點。發現這樣一定能遍歷到最優解。雖然當左端點固定後,起點的位置就不固定了,但在起始狀態是我們可以列舉確定的,通過這種方法我們可以減少左端點不固定的麻煩。