搜索 —— 深度优先搜索(DFS)
生活随笔
收集整理的這篇文章主要介紹了
搜索 —— 深度优先搜索(DFS)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【概述】
深度優先搜索,是從初始狀態起,利用一定的規則生成搜索樹,尋找下一層任一個結點,檢查是否出現目標狀態,若未出現,以此狀態利用規則生成再下一層任一個結點,再檢查,重復過程一直到葉節點(即不能再生成新狀態節點),當它仍不是目標狀態時,回溯到上一層結果,取另一可能擴展搜索的分支。采用相同辦法一直進行下去,直到找到目標狀態為止。
狀態必須在遍歷完所有它的子狀態之后,才能繼續進行對同一層中下一個狀態的遍歷。
由于深度優先搜索是利用規則生成搜索樹實現的,其符合棧的先進后出的性質,因此當需要搜索最深處的結點時,利用深搜較為適合。
?
在搜索的過程中,由于搜索的低效無法很好的處理重疊子問題,動態規劃雖然較好的處理了重疊子問題但再一些具拓撲關系的題前較無奈,因此可采用記憶化搜索的方法,通過記憶化記錄每個狀態的搜索結果,在重復遍歷一個狀態時直接檢索并返回。
簡單地說就是:記憶化搜索=搜索的形式+動態規劃的思想
【具體過程】
????
每個方塊表示一個狀態,淺藍色的表示遍歷了該狀態黑色代表當前探索的狀態,淺藍色為已經搜索過的狀態,灰色為未搜索的狀態。在過程中遇到搜索的解則退出,找到答案。
【實現】
void dfs(答案,搜索層數,其他參數){if(層數==maxdeep){更新答案;return; }(剪枝) for(枚舉下一層可能的狀態){更新全局變量表示狀態的變量;dfs(答案+新狀態增加的價值,層數+1,其他參數);還原全局變量表示狀態的變量;} }【例題】
同題:滑雪(信息學奧賽一本通-T1280):點擊這里
同題:單詞接龍(信息學奧賽一本通-T1220):點擊這里
總結
以上是生活随笔為你收集整理的搜索 —— 深度优先搜索(DFS)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛C++语言:趣味整数4(水仙花
- 下一篇: 信息学奥赛C++语言:乘车费用