区间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