記憶化搜索的應用

記憶化搜索的應用

一般來說,動態規劃總要遍歷所有的狀態,而搜索可以排除一些無效狀態。更重要的是搜索還可以剪枝,可能剪去大量不必要的狀態,因此在空間開銷上往往比動態規劃要低很多。

如何協調好動態規劃的高效率與高消費之間的矛盾呢?有一種折中的辦法就是記憶化算法。記憶化算法在求解的時候還是按著自頂向下的順序,每求解一個狀態,就將它的解保存下來,以后再次遇到這個狀態的時候,就不必重新求解了。這種方法綜合了搜索和動態規劃兩方面的優點,因而還是很有使用價值的。

舉一個例子:如右圖所示是一個有向無環圖,求從頂點1到頂點6的最長路徑。(規定邊的方向從左到右)

我們將從起點(頂點1)開始到某個頂點的最長路徑作為狀態,用一維數組opt記錄。Opt[j]表示由起點到頂點j時的最長路徑。顯然,opt[1]=0,這是初始狀態,即動態規劃的邊界條件。于是,我們很容易地寫出狀態轉移方程式:opt[j]=max{opt[k]+a[k,j]}(k到j有一條長度為a[k,j]的邊)。雖然有了完整的狀態轉移方程式,但是還是不知道動態規劃的順序。所以,還需要先進行一下拓撲排序,按照排序的順序推下去,opt[6]就是問題的解。

可以看出,動態規劃相比搜索之所以高效,是因為它將所有的狀態都保存了下來。當遇到重復子問題時,它不像搜索那樣把這個狀態的最優值再計算一遍,只要把那個狀態的最優值調出來就可以了。例如,當計算opt[4]和opt[5]時,都用到了opt[3]的值。因為已經將它保存下來了,所以就沒有必要再去搜索了。

但是動態規劃仍然是有缺點的。一個很突出的缺點就是要進行拓撲排序。這道題的拓撲關系是很簡單的,但有些題的拓撲關系是很復雜的。對于這些題目,如果也進行拓撲排序,工作量非常大。遇到這種情況,我們可以用記憶化搜索的方法,避免拓撲排序。

【例】滑雪

【問題描述】

小明喜歡滑雪,因為滑雪的確很刺激,可是為了獲得速度,滑的區域必須向下傾斜,當小明滑到坡底,不得不再次走上坡或等著直升機來載他,小明想知道在一個區域中最長的滑坡。滑坡的長度由滑過點的個數來計算,區域由一個二維數組給出,數組的每個數字代表點的高度。下面是一個例子:

1???? 2???? 3???? 4???? 5

16??? 17??? 18??? 19??? 6

15??? 24??? 25??? 20??? 7

14??? 23??? 22??? 21??? 8

13??? 12??? 11??? 10??? 9

一個人可以從某個點滑向上下左右相鄰四個點之一,當且僅當高度減小,在上面的例子中,一條可行的滑坡為25-24-17-16-1(從25開始到1結束),當然25-24……2…1更長,事實上這是最長的一條。

【輸入格式】

輸入的第一行為表示區域的二維數組的行數R和列數C(1≤R、C≤100),下面是R行,每行有C個數代表高度。

【輸出格式】

輸出區域中最長的滑坡長度。

【輸入樣例】ski.in

5????? 5

1????? 2???? 3???? 4???? 5

16??? 17? ??18??? 19??? 6

15??? 24??? 25??? 20??? 7

14??? 23??? 22??? 21??? 8

13??? 12??? 11??? 10??? 9

【輸出樣例】ski.out

25

【算法分析】

由于一個人可以從某個點滑向上下左右相鄰四個點之一,如上圖所示。當且僅當高度減小,對于任意一個點[i,j],當它的高度小于與之相鄰的四個點([i-1,j], [i,j+1], [i+1,j], [i,j-1])的高度時,這四個點可以滑向[i,j],用f[i,j]表示到[i,j]為止的最大長度,則f[i,j]=max{f(i+a,j+b)}+1,其中坐標增量{(a,b)=[(1,0),(-1,0),(0,1),(0,-1)],0<i+a<=r,0<j+b<=c,High[i,j]<High[i+a,j+b]}。為了保證滿足條件的f[i+a,j+b]在f[i,j]前算出,需要對高度排一次序,然后從大到小規劃(高度)。最后再比較一下所有f(i,j){0<i≤r,0<j≤c},找出其中最長的一條路線。我們還可以用記憶化搜索的方法,它的優點是不需進行排序,按照行的順序,利用遞歸逐點求出區域中到達此點的最長路徑,每個點的最長路徑只求一次。

 1 const
 2   dx:array[1..4] of shortint=(0,-1,0,1);    {x的坐標增量}
 3   dy:array[1..4] of shortint=(-1,0,1,0);    {y的坐標增量}
 4 var
 5   r,c,ans,anss:longint;
 6   map,f:array[1..100,1..100] of longint; 
 7 procedure init;
 8 var i,j:longint;
 9 begin
10   readln(r,c);
11   for i:=1 to r do
12    for j:=1 to c do
13     read(map[i,j]);                   {讀入每個點的高度}
14   ans:=0; anss:=0;
15   fillchar(f,sizeof(f),0);
16 end;
17 function search(x,y:longint):longint;           {函數的作用是求到[x,y]點的最長路徑}
18 var i,j,nx,ny,tmp,t:longint;
19 begin
20   if f[x,y]>0 then   {此點長度已經求出,不必進行進一步遞歸,保證每一個點的最大長度只求一次,這是記憶化搜索的特點}
21    begin
22      search:=f[x,y]; exit;
23    end;
24   t:=1;
25   for i:=1 to 4 do                      {從四個方向上搜索能達到[x,y]的點}
26    begin
27      nx:=x+dx[i]; ny:=y+dy[i];               {新坐標}
28      if (1<=nx)and(nx<=r) and (1<=ny)and(ny<=c)    {邊界限制}
29                       and (map[nx,ny]>map[x,y])    {高度比較}
30       then
31        begin
32          tmp:=search(nx,ny)+1;              {遞歸進行記憶化搜索}
33          if tmp>t then t:=tmp;
34        end;
35    end;
36   f[x,y]:=t;
37   search:=t;
38 end;
39 procedure doit;
40 var i,j:longint;
41 begin
42   for i:=1 to r do               {按照行的順序,利用遞歸逐點求出區域中到達此點的最長路徑}
43    for j:=1 to c do
44      begin
45        anss:=search(i,j);
46        //f[i,j]:=anss;
47        if anss>ans then ans:=anss;          {尋找最大長度值}
48      end;
49 end;
50 procedure outit;
51 var i,j:longint;
52 begin
53   {for i:=1 to r do begin
54    for j:=1 to c do
55     write(f[i,j],' '); writeln; end;}
56   writeln(ans);
57 end;
58 begin
59   init;
60   doit;
61   outit;
62 end.

?

轉載于:https://www.cnblogs.com/vacation/p/6071586.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255985.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255985.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255985.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【深度學習】——DNN后向傳播、CNN后向傳播文章匯總

深度神經網絡&#xff08;DNN&#xff09;模型與前向傳播算法 深度神經網絡&#xff08;DNN&#xff09;反向傳播算法(BP) 卷積神經網絡CNN的前向和后向傳播&#xff08;一&#xff09; 卷積神經網絡CNN的前向和后向傳播&#xff08;二&#xff09; 有batch normalization的卷積…

ajaxReturn 之前dump調試,導致$.ajax不能正常運行

ajaxReturn 之前dump調試&#xff0c;導致$.ajax不能正常運行 以后調試的時候&#xff0c;注意下這個情況轉載于:https://www.cnblogs.com/bushe/p/5180317.html

Veebot-自動靜脈抽血機器人

Veebot-自動靜脈抽血機器人 我們可能都有過被抽血的經驗。護士讓你握緊拳頭&#xff0c;用一根橡皮條壓住你上臂的血管&#xff0c;在你的肘部內側尋找你的靜脈&#xff0c;有時還需要拍打幾下&#xff0c;摸到隆起的靜脈血管&#xff0c;一針下去。有時候碰到技術好的護士&…

idea 轉普通項目為maven 項目

1、項目上右鍵 Add Framework Support。 2、選擇maven&#xff0c;點擊OK。 轉載于:https://www.cnblogs.com/mayanze/p/8042489.html

HDOJ5547 SudoKu

題目鏈接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid5547 題目大意&#xff1a;填數獨。。。 思路&#xff1a;爆搜 1 #include <stdio.h>2 #include <string.h>3 #include <iostream>4 #include <algorithm>5 using namespace std;6 boo…

【深度學習之ResNet】——深度殘差網絡—ResNet總結

目錄 論文名稱&#xff1a;Deep Residual Learning for Image Recognition 摘要&#xff1a; 1、引言 2、為什么會提出ResNet殘差網絡呢&#xff1f; 3、深度殘差網絡結構學習&#xff08;Deep Residual learning&#xff09; &#xff08;1&#xff09;殘差單元 &#xf…

Atitit.??c#?語法新特性?c#2.0?3.0?4.0?4.5?5.0?6.0???attilax總結

Atitit. c# 語法新特性 c#2.0 3.0 4.0 4.5 5.0 6.0 attilax總結 1.1. C# 1.0-純粹的面向對象 1.2. C# 2.0-泛型編程新概念 1.3. C# 2.0的另一個突出的特性就是匿名方法 1.4. C#3.0 linq 1.5. C# 4.0動態編程 dynamic 1.6. C# 4.5 異步編程 async和await 1.7. C# 5.0 更方便…

關于SafeMove White Paper功能

ABB機器人網站有一個 Safemove 功能的介紹&#xff0c;在Overview頁面右半版有一篇文檔是 SafeMove White Paper &#xff0c;在45頁的 pdf 文檔中&#xff0c;詳細了介紹工業機器人的安全原則&#xff0c;以及ABB工業機器人自身 EPS (Electronic Position Switches) 和 SafeMo…

面試疑難點解析

List,Set,Map,有什么區別&#xff1f; List和Set實際上市實現了Collection接口&#xff0c;那么Collection接口的原理你能簡單描述一下嗎&#xff1f; List接口可以插入多個NULL值&#xff0c;并且重復值&#xff0c;而且LIST是一個有序的集合。 Set是一個不可重復的集合&#…

【深度學習】——日常知識點總結(持續更新)

設計卷積網絡的原則&#xff1a; 1、最后轉為一維有兩種方式&#xff1a;1&#xff09;全局平均池化&#xff1b;2&#xff09;扁平化直接轉化為一維的 2、在卷積層的大小變化時盡量保證特征圖大小減小n倍時&#xff0c;特征圖的個數也增加n倍&#xff0c;維持網絡的復雜度&a…

主機無法訪問虛擬機的httpd服務

癥狀&#xff1a;虛擬機裝的centos6.3 通過橋接的方式與主機連接 虛擬機通過yum安裝httpd服務 在主機瀏覽器中輸入 虛擬機ip 無法訪問虛擬機Apache 虛擬機和主機可以相互ping通 解決&#xff1a;關掉虛擬機的防火墻就可以了 命令setup進入防火墻管理 按空格鍵取消防火墻啟用 轉…

越獄Season 1- Episode 22: Flight

Season 1, Episode 22: Flight -Franklin: You know you got a couple of foxes in your henhouse, right? fox: 狐貍 henhouse: 雞舍 你的隊伍里都是一群狐貍 -Michael: They both want out of here. both: 兩者都 他們都想出去 Theyll behave until then. behave: 舉止端…

巴科斯范式BNF: Backus-Naur Form介紹

巴科斯范式(BNF: Backus-Naur Form. 的縮寫)是由 John Backus 和 Peter Naur 首次引入一種形式化符號來描述給定語言的語法&#xff08;最早用于描述ALGOL 60 編程語言&#xff09;。 現在&#xff0c;幾乎每一位新編程語言書籍的作者都使用巴科斯范式來定義編程語言的語法規則…

2017-2018-1 20155229 《信息安全系統設計基礎》第十三周學習總結

2017-2018-1 20155229 《信息安全系統設計基礎》第十三周學習總結 對“第二章 信息的表示和處理”的深入學習 這周的任務是選一章認為最重要的進行學習&#xff0c;我選擇了第二章。當今的計算機存儲和處理信息基本上是由二進制&#xff08;位&#xff09;組成&#xff0c;二進…

【VOC格式xml文件解析】——Python

#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/4/26 12:49 # Author : linlianqin # Site : # File : test1.py # Software: PyCharm # description: import xml.etree.ElementTree as ETdef xmli(xmlpath):xmlTree ET.parse(xmlpath) # 解析xml文…

C—的BNF語法

近期用到ABB機器人&#xff0c;RAPID使用BNF語法規則描述&#xff0c;所以不得不復習了一下BNF語法描述規則&#xff0c;通過C的BNF描述&#xff0c;喚醒我的記憶 %>_<% C—的BNF語法如下&#xff1a; 1. program → declaration-list 2. declaration-list → decla…

Warning: Attempt to present on whose view is not in模態跳轉問題

錯誤分析&#xff1a; controller A present controller B ,前提是A的view要存在&#xff0c;如果不存在&#xff0c;就會報這個錯。解決方法&#xff1a; 將原來的present語句由 viewDidLoad方法中移到 viewDidAppear中&#xff0c;問題就可以解決。但是這樣的話&#xff0c;畫…

Reflector7及破解

Reflector7開始收費&#xff0c;前面的版本都已經過期&#xff0c;在網上下載了Reflector7&#xff0c;并找到了破解軟解&#xff0c;特在此分享。 下載地址&#xff1a; Reflector7.1.0.143.zip&Red.Gate_.NET_.Reflector.7.1.0.143.patch-SND.zip 本文轉自xwdreamer博客園…

win7系統的右鍵菜單只顯示一個白色框不顯示菜單項 解決辦法

如上圖所示&#xff0c;桌面或其他大部分地方點擊右鍵菜單&#xff0c;都只顯示一個白色框&#xff0c;鼠標移上去才有菜單項看&#xff0c;并且效果很丑 解決辦法&#xff1a; 計算機—右鍵—屬性—高級—性能—設置—視覺效果—淡入淡出或滑動菜單到視圖&#xff0c;將其前面…

【setup.py編譯出錯】——提示無法查找到powershell.exe

https://www.cnblogs.com/wind-chaser/p/11359521.html pytorch fasterrcnn訓練自己數據集文章鏈接 在進行faster rcnn pytorch跑通的時候遇到的&#xff0c;我是直接在pycharm中的終端上進行運行的&#xff0c;但是一直會跳出powershell.exe無法查找的錯誤&#xff0c; pytho…