DP模式
DP也練了一部分,找感覺。
說一下VIJOS上的。
◆線性連接性的問題(包括分配問題,轉換問題,連接問題,及宏觀擴展),這樣的例子比較多,方程就是由一維來記錄處理到的線性位置作為階段,然后用額外的未來記錄分配的情況,之前臨近的連接情況等,這樣一個一個把狀態(tài)連接起來得最優(yōu)
例子:
P1323化工廠裝箱員 P1386礦工配餐 P1417魔法塔防 P1421更換輪胎 P1456最小總代價 P1470教主的后花園 P1002過河
◆線性的選擇問題
這種就是類似最長不上升子序列之類的那種,當處理到i時,在前面選擇一個可能的情況跟他連起來,例子比如說:
P1098合唱隊形 P1331看球的巴士
◆開放的劃分推進
這種一般就是一個二維的方程,表示把這一段分在一起,可以開額外的維來表示一些特殊的情況,這樣可以已分段為階段向后推進,這種一般可以用于一種按照某種規(guī)則劃分,使劃分的段數最優(yōu)的問題,也就是劃分的段數未知時,并且這個不適于環(huán)形的,記憶化的話會出問題。。。
例子:
P1306 遞增序列 P1322解題
◆封閉的劃分或者選擇
一般就是二維的方程表示把這一段已經劃分完畢后的情況,以劃分的的長度為階段,比較適合于給定劃分段數的劃分問題,可以處理環(huán),用記憶化會比較好些。。。轉移時可以枚舉劃分的中心或者這一部分中劃分為獨立的一段的位置
例子:
P1100加分二叉樹 P1118統(tǒng)計單詞個數 P1218數字游戲 P1312能量項鏈
◆樹形DP
很好很強大的Dp,一般依托樹上的關系進行轉移,并且因為依托關系比較嚴重,所以會開幾維來記錄情況,將每種情況分開處理。一般,如果不愿意多叉轉二叉,可以用哪種求和以后進行枚舉兒子進行替換
例子
P1144小胖守皇宮 P1395HYH的邏輯電路
◆背包問題
背包是個很好很強大的東西,各種例子,應用太多了。。。包括分組背包,判定性背包,將詭異的東西作為物品什么的。。。例子:
P1025小飛俠游園方案 P1104采藥 P1117數的劃分 P1133裝箱問題 P1198最佳課題選擇 P1313今明的預算方案 P1317開心的今明 P1334NASA的食物計劃 P1407古韻之刺繡
?
◆圖上的DP
圖上的DP一般都會有某種限制來形成階段和無后效性,比如階段圖,方向限制,權值(編號)限制,時間線限制,找到這個階段就好搞了,最好進行記憶化搜索
例子:P1011清帝疑惑之順治 P1364吃吃吃 P1370采果子 P1474雷曼兔
?
◆多進程DP 多方向Dp
這些都是比較奇怪的類型,比如旅行商簡化版,HILL,三取方格數。。。不具體說了
?
◆雙位選擇問題:
類似最長公共子序列那種的,有兩種兩種位置共同構成狀態(tài),然后根據限制條件,選擇兩邊,或者放棄某一邊
一些例子:
P1327回文詞 P1378矩陣取數游戲
?
◆包含性的可行性DP
V囧上比較少,但是如果想不到最優(yōu)性的DP,可以想這種可行性的。。。
?
◆◆注意的問題
多個小Dp組成,比如矩陣取數游戲,統(tǒng)計單詞個數,合唱隊形之類的,就是不同次的DP沒有關系,但是總起來就解決問題了。
空間問題:考慮可不可以使用滾動數組,但那時滾動數組如果正推要考慮每次都進行初始化
數據范圍:看清楚是否需要高精,另外如果用int64那么中間的變量也需要用int64
賦初始值:有時注意賦值為maxlongint時,注意是不是會不夠大,中間過程會不會兩個相加爆掉。。。
環(huán)形DP--處理環(huán):處理環(huán)有好幾種情況,比如依賴于劃分的,主要問題就是劃分點可能正好位于環(huán)的兩端相連的的地方,所以一般的做法是拷貝環(huán),然后枚舉每個起始點,記憶化搜索,比如數字游戲,能量項鏈。另一種就是可能就是相鄰的決策有限制條件,這樣可以單獨處理一下邊界位置就行了,比如說1470后花園。
輸出方案:狀態(tài)轉移的時候順便記錄,至于字典序的問題,不一定在每次DP的時候選擇一個字典序比較靠前的,要想清楚,最好都記下來然后深搜或者用字符串排
總結
- 上一篇: 2012年CS毕业生
- 下一篇: Skpi List跳表