前幾天做這個題,由於寫的太差了,導致我寫了9個版本,直到最後一個才過掉……
數一下我的幾個版本:
ver1:考試時寫出的第一版,用的是一個動態規劃思想,但是調不對,放棄……
ver2:考試時寫的第二版,用網絡流建模,建模方法:若從i能到j,就從i向j連一條費用爲-1,容量爲1的邊。每個點向匯連一條容量爲1、費用爲0的邊,源向每個點連一條費用爲-1、容量爲1的邊,超級源向源連一條費用爲0、容量爲2的邊,求超級源到匯的費用流。WA掉。
ver3:看了解題報告後寫的一個版本,改了建模方法,拆點,若從i能到j,就從i+n向j連一條費用爲0,容量爲1的邊。i向i+n連一條費用爲-1、容量爲1的邊,其餘相同。
ver4:改了費用流算法,由原始對偶轉爲isap增廣。
ver5:又改了費用流算法,轉爲push-relabel增廣。
ver6:還改費用流算法,直接spfa增廣。
ver7:騙分策略,先求一條最長上升子序列,再在這條線左右分別求一條,WA掉。
ver8:迴歸最大流,直接手動增廣,先求一條最長上升子序列,模擬費用流增廣,直接構圖,不含0邊,然後用spfa求最短路,用的ver2的構圖方式,WA掉。
ver9:改變構圖,用ver3的構圖,終於AC……
附上源代碼: