天天看點

近期學習總結2019/4/17

區間DP結束了,感覺這一部分學的不太好,做起題來很吃力,速度也慢了不少,一邊模仿着例題一邊做也不能比較好的完成。新學的搜尋聽課時感覺還可以,但看到題以後就覺得有點懵,還是不太懂怎麼應用。

這兩天主要是在複習課件和看題,晚上會試着打一打搜尋的代碼,不過目前做題還沒有什麼進展。看搜尋例題的同時也會抽時間看一下區間DP。我看題的速度實在是有點慢,到現在區間DP那些題還沒有看完,以後會再多花一點時間,并試着加快速度。

關于搜尋

搜尋分為廣度優先搜尋(BFS)和深度優先搜尋(DFS)

**廣度優先搜尋(BFS)**在路徑的尋找問題上用得比較多

基本思想:從初始狀态S 開始,利用規則,生成所有可能的狀态。構成的下一層節點,檢查是否出現目标狀态G,若未出現,就對該層所有狀态節點,分别順序利用規則,生成再下一層的所有狀态節點,對這一層的所有狀态節點檢查是否出現G,若未出現,繼續按上面思想生成再下一層的所有狀态節點,這樣一層一層往下展開。直到出現目标狀态為止。

廣度優先即是要按層數一層一層來周遊,先将一層全部擴充,然後再進行下一層。

廣度優先搜尋架構

While Not Queue.Empty ()

Begin

可加結束條件

Tmp = Queue.Top ()

從Tmp循環拓展下一個狀态Next

If 狀态Next合法 Then

Begin

生成新狀态Next

Next.Step = Tmp.Step + 1

Queue.Pushback (Next)

End

Queue.Pop ()

End

深度優先搜尋(DFS)

基本思想:從初始狀态,利用規則生成搜尋樹下一層任一個結點,檢查是否出現目标狀态,若未出現,以此狀态利用規則生成再下一層任一個結點,再檢查,重複過程一直到葉節點(即不能再生成新狀态節點),當它仍不是目标狀态時,回溯到上一層結果,取另一可能擴充搜尋的分支。采用相同辦法一直進行下去,直到找到目标狀态為止。

狀态必須在周遊完所有它的子狀态之後,才能繼續進行對同一層中下一個狀态的周遊。.

深度優先搜尋架構

遞歸實作:

Function Dfs (Int Step, 目前狀态)

Begin

可加結束條件

從目前狀态循環拓展下一個狀态Next

If 狀态Next合法 Then

Dfs (Step + 1, Next ))

End

非遞歸實作:

While Not Stack.Empty ()

Begin

Tmp = Stack.top()

從Tmp拓展下一個未拓展的狀态Next

If 沒有未拓展狀态(到達葉節點) Then

Stack.pop()

Else If 狀态Next合法 Then

Stack.push(Next)

End