小結 A IDA 迭代深搜

2022-05-12 01:36:42 字數 1007 閱讀 5985

在dfs中,如果答案的深度很小但是卻很寬,而且bfs還不一定好做的情況下,我們就綜合bfs的優點,結合dfs的思想,進行有限制的dfs。在這裡a*、ida*和迭代深搜都是對dfs的優化,因此放到一塊小結。

a*的概念主意在於估計函式,f(n)=g(n)+h(n),f(n)是估計函式,g(n)是n節點的當前代價,h(n)是n節點的估計代價;而實際中,存在最優的估計函式f'(n)=g'(n)+h'(n),那麼顯然我們在a*的估計中,h(n)<=h'(n),否則你將搜不到最優解;(g(n)>=g'(n)我還不怎麼清楚為什麼啊,大多數情況是g(n)=g'(n),這個可以不用管吧。。),所以我們可以根據題目所給約束來計算估計代價,當然越逼近h'(n)的估計代價效率越高(顯然bfs是h(n)=0的情況)(有關a*概念介紹在這篇博文裡【bzoj】1085: [scoi2005]騎士精神(a*啟發式搜尋))

裸的a*是往下搜的話更新答案(剪掉估計函式》當前最優解的枝),但是深度還是可能很大,所以我們考慮迭代深搜。

迭代深搜又是一種思想,即限制搜尋深度,這樣a*與迭代深搜結合起來就成為了ida*,效率大大提高。

技巧只有乙個,就是盡量時h(n)逼近h'(n),那麼我們就要考慮如何逼近。

例如【bzoj】1085: [scoi2005]騎士精神(a*啟發式搜尋)這題就是考慮到了「當前沒有到達目標位置的點的數量」,用這個作為h(n),而這是顯然正確的,即h(n)<=h'(n),因為無論如何不在目標位置上的點總是要至少移動一步才能到達目標。(拓展:假設沒有空格,而是可以直接換,那麼我們可以/2就行了。這也是顯然的吧)

然後還有乙個應用是求k短路,其中用起點到當前點的維護資訊作為g(n),當前點到終點的維護資訊作為h(n),這個估計代價也是顯然的吧。然後每次將估價函式最小的先彈出來做bfs。當bfs的當前節點為終點時,那麼ans+=1,當ans==k時就能結束bfs了,此時的g(n)就是k短路,例題【poj】2449 remmarguts' date(k短路)。(在這裡如果起點終點都相等,那麼在bfs前要處理k為++k,因為起點和終點的距離為0了,顯然會在第一次bfs就累計了答案,而這個答案是我們所不需要的)

深搜剪枝小結

深度優先搜尋,俗稱深搜,即dfs,是乙個常用並且基礎的演算法和思想。但是搜尋演算法的時間複雜度往往很大,是oi不被允許的。所以對於深搜的優化最實用和基礎的乙個方法就是剪枝。三原則 1 正確性 2 準確性 3 高效性 正確性,顧名思義就是不能把通向正確的路徑剪去。準確性,則是盡可能多的剪去不會通向正確...

ACM 迭代深搜法 Power Calculus

滴,集訓第五天打卡。今天是紫書第七章訓練2,感覺難度很大呀.a和e是迭代深搜法,c是揹包我首a的哈哈哈哈後續更新 這裡貼e題.題目大意 給定乙個數n,讓你求從1至少要做多少次乘除才可以從 x 得到 x n。思路 從小到大列舉深度上限,剪枝 當每次取最大的兩個數相加仍然小於n時要剪枝 因為以最快的方式...

CSU2087 迭代深搜dfs

思路 dfs,用vowel記錄連續的母音字母,用consonant記錄連續的子音字母,深搜字串的位置 str i 的i 用cnt存悲劇詞的個數,最後用t判斷字串中是否含 l include include include include includeusing namespace std stri...