“按字典序輸出方案” 解決方法

前言

在平日的刷題中,經常遇到按字典序輸出方案的問題,之前總是會優先考慮對於每個狀態記錄從起點開始的完整路徑,但對於數據量較大的題很容易 TLETLEMLEMLE,因此我們需要思考更加通用的方法。


特殊情況

典型例題:HDU 1074

此題是一道典型的狀壓 DP 問題,要求最終方案根據字典序輸出。

對於此題,我們可以直接將初始數據根據字典序排列,然後從小到大枚舉狀態,每次選取最小的元素更新下一個狀態。

這種正向更新的方法不會出錯的原因在於,對於狀態壓縮 DP,其狀態本身就代表了字典序,由於初始數據根據字典序排列,因此狀態 S 數值越小則其對應的字典序就越小,因此直接正向更新即可,不會出錯。


通用方案

典型例題:UVA 1599

對於按字典序輸出方案的問題,更加通用的方案是倒序枚舉,在倒序枚舉的過程中始終選擇字典序最小的元素,最後再正向輸出方案。

倒序枚舉方法的正確性在於由於是倒序枚舉,因此每次選擇的元素的字典序對整個序列的字典序有決定性作用。此處需要與正序枚舉進行對比以做出區分,在正序枚舉中,每次選擇最小字典序的元素來更新答案,但選擇的元素作爲當前序列最末尾的元素,對整個序列的字典序幾乎沒有影響,因此會導致最終答案出錯。而倒序枚舉則保證了每次枚舉元素的決定性作用,因此正確。

參考文章:友情鏈接


總結

最後,我們可以得出一個結論。

  1. 對於狀壓問題,狀態 S 本身就代表了字典序,因此可以正序枚舉
  2. 對於其他的問題,倒序枚舉是一個更加普適的方法

後記

今天做題的時候再次碰到了記錄方案的題目,因此就在此整理一下作爲記錄。

希望能夠持續輸出,不停下腳步,就能離那束光更近一些!💪💪💪

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章