[專題練習] Part1 搜索
阿新 • • 發佈:2018-10-10
new 利用 枚舉 經驗 mil P20 擴展 格子 -s
一.DFS(深度優先搜索)
過於水略過。
二.BFS(廣度優先搜索)
同上。
三.記憶化
記憶化搜索,就是我們的狀態會重復利用,為了防止狀態的重復計算耗費不必要的時間,我們可以把這個狀態的結果記錄下來,然後查詢表中的結果就行了。
一般來所,記憶化搜索是和DP等價的。如果遞推的DP不好寫,可以考慮用記憶化搜索實現,但是因為是遞歸,所以常數略大。記憶化搜索有明顯的優點,就是可以不用考慮狀態在哪裏終止,只用知道狀態會終止就行了。
四.搜索剪枝
這是一門博大精深的學問, 通常用於解決搜索時間復雜度過高的問題。
原理就是在龐大的搜索樹上剪去不可能對答案產生貢獻的枝條。
搜索+剪枝的時間復雜度是$O(玄學)$,因為我們只能通過經驗來估測剪枝效果。
所以考試打暴力的時候一定要多寫剪枝,尤其是奇形怪狀的玄學剪枝(參考i207m某次比賽的$N^2$跑過1e9)。
幾道例題:
1. Noip2015鬥地主 。
貪心出牌,出完順子枚舉出其他的盡可能出的多的牌的組合。
加上最優化剪枝,如果現在出了$ans-1$次沒有出完就剪枝。
2.Noip2009靶形數獨
我當時用了$lowbit$優化常數,然後把整個棋盤分成上下兩部分,如果上半部分空位比下半部分多,就從下半部開始搜索。這樣就睡、水過去了。
其實也可以按格搜索,優先搜可填的少的格。
還有$A*$剪枝,如果剩下的格子都填9還比$ans$小的話就剪枝。
通常使用的剪枝技巧
1.最優性剪枝。
2.$A*$剪枝。
3.改變搜索順序,優先搜索擴展出的狀態比較少的狀態。
五.雙向廣搜
正在研究中...
[專題練習] Part1 搜索