01 故事起源有一天小K去滑雪,雪山高低不平,當然小K只能從高的地方向低的地方滑,那如何選擇路線才能滑的最遠呢? 把這個問題抽象描述如下:
在一個二維地圖中,數值代表此處山的高度,在某個點只能滑向上下左右4個相鄰的點,最遠的滑行路線,也就等價于找出一條最長的數值下降路線。
比如下圖中的紅色路線就是此時最長的一條路線,長度為10。那要如何找出這樣的一條路線呢?
?
?02
分析在每個點上,只能向周圍4個方向滑行,當然前提是此處的高度必須比周圍高。
?我們當然可以選擇盡可能高的位置出發,比如圖中17比15要高。
?但這種有可能會陷入局部最優解,比如從下圖中的15開始,最大長度為2。而從13開始會更優,長度為5。
?所以啟示我們,不能簡單的貪心,而是要考慮全局最優,因為每一個起點都有可能是最優的起點。那就有了初步的框架了,從每一個起點出發,把可行的路線都找出來,也就是能走的路線都走一遍,再比較全局最優的就行了,而且這也正好符合深搜的算法框架。偽代碼
intfind(inti,intj){ //向4個方向嘗試 for(i=0->3){ if(ok){ returnfind(next)+1 } } } intmain(){ for(i=0->n){ for(j=0->m) { t=find(i,j) ans=max(ans,t) } } } 03 問題上面的做法可以得到最優解,但有一個問題。如下例,以15為起點的時候,會嘗試把6->5->4->3->2->1走一遍。但以16為起點的時候,還會嘗試把這條路線走一遍,這就會導致大量的重復計算。
?那能不能優化呢? 之所以重復計算,是因為每一次嘗試都是重新的開始,它并不知道這條路已經走過了,也就是沒有記憶,所以我們引入一種優化的方法,就是記憶化搜索。
04
記憶化搜索可以引入一個f[i][j]數組,記錄以(i,j)為起點所能找到的最長路線的長度,初始賦值為-1,表示還沒有走過。
?當走過一點,就將對應的f[i][j]更新為以(i,j)為起點的最大長度。 再回到上面的問題,因為之前肯定走過了(2,3),對應的f[2][3]為6,當嘗試從(2,4)出發時,會發現周圍已經走過了,只需要更新當前的值+1即可,就避免了重復計算。
?
?05
代碼實現路線搜索intfind(vector<vector<int>>&snowMountain,vector<vector<int>>&f,inti,intj,intr,intc){ intx,y; if(f[i][j]!=-1) returnf[i][j]; f[i][j]=1; for(intk=0;k4;k++){ x=i+direction[k][0]; y=j+direction[k][1]; //validdirection if(x>=0&&x=0&&ysnowMountain[x][y]){ f[i][j]=maxOfTwo(f[i][j],find(snowMountain,f,x,y,r,c)+1); } } returnf[i][j]; }main函數
intmain(){ ifstreamfin("a.in"); ofstreamfout("a.out"); inti,j,r,c,maxHeight=0; fin>>r>>c; vector<vector<int>>snowMountain(r,vector<int>(c,0)); vector<vector<int>>f(r,vector<int>(c,-1)); for(i=0;ifor(j=0;j>snowMountain[i][j]; for(i=0;ifor(j=0;jendl; fin.close(); fout.close(); return0; } 06 總結記憶化搜索是一種非常實用的算法,因為深搜用遞歸很容易實現,記憶化又避免了重復子問題的計算,提高了運行效率。 這其實就是動態規劃的思想,常見的動態規劃用遞推實現,相比記憶化搜索實現上會更難一點,而記憶化搜索就沒有這個問題。 算法的適用場景也需要根據具體的問題來分析,一般常用在地圖或者樹型結構中。 審核編輯 :李倩
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
算法
+關注
關注
23文章
4784瀏覽量
98060 -
代碼
+關注
關注
30文章
4968瀏覽量
73970
原文標題:啥是記憶化搜索?
文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
熱點推薦
指令集測試的一種糾錯方法
本文描述在進行指令集測試的一種糾錯方法
1.打開測試指令集對應的dump文件
dump文件是指由匯編文件進行反匯編之后,可以供人閱讀指令的反匯編文件。其包含了每一條指令的具體操作的信息。指令集測試
發表于 10-24 14:04
搜索商品ID獲取商品詳情接口
? ?在電商平臺或庫存管理系統中,通過商品ID快速搜索并獲取商品詳情是一項核心功能。該接口允許用戶或應用程序輸入唯一的商品標識符(ID),返回結構化數據如名稱、價格、庫存等。本文將逐步
京東:利用商品管理API自動調整商品上下架狀態,優化搜索排名
? 京東:利用商品管理API自動調整商品上下架狀態,優化搜索排名 在電商運營中,高效管理商品狀態是提升銷售的關鍵。京東作為領先的電商平臺,提供了強大的商品管理API,允許商家通過編程方式自動化操作
產品搜索與過濾API接口
這些功能。本文將詳細介紹其原理、設計實現和實際應用,幫助您逐步構建可靠的API系統。 1. 什么是產品搜索與過濾API接口 產品搜索與過濾API接口是一種基于HTTP的接口,允許客戶端發送請求來查詢產品數據,并根據特定條件篩選結
根據標題利用API優化電商搜索功能:提升轉化率
? 在電商平臺中,搜索功能是用戶發現商品的核心入口。一個高效的搜索系統不僅能提升用戶體驗,還能顯著提高轉化率——即用戶從搜索到實際購買的比率。然而,傳統
一種高效智能的光伏電站管理平臺
儲一體化(集成多種儲能管理功能等)。用戶根據自身場景和需求,選擇合適光伏電站管理平臺及功能應用配置,從而實現發電效率最大化、運維成本最小化及碳中和目標。 光伏電站管理平臺作為一種智能光伏管理系統,通過光伏智能管理
一種環保型紅色發煙彈主裝藥配方設計與優化
(DSC)的功能,能夠在同一實驗條件下同時獲得樣品的質量變化和熱流信息。一種環保型紅色發煙彈主裝藥配方設計與優化【(1、武警工程大學研究生大隊2、武警工程大學裝備
無刷直流電機滑模觀測器參數優化設計方法
摘要:滑模反電勢觀測器的增益參數會影響觀測器的收斂速度以及動態響應性能,常見的設計方法是基于觀測器穩定性理論進行設計。提出一種利用遺傳算法在穩定域內搜索觀測誤差最小的增益參數的新方法,
發表于 06-27 16:48
漢思新材料取得一種PCB板封裝膠及其制備方法的專利
漢思新材料取得一種PCB板封裝膠及其制備方法的專利漢思新材料(深圳市漢思新材料科技有限公司)于2023年取得了一項關于PCB板封裝膠及其制備方法的發明專利(專利號:CN20231015
Pea Puffer非球面:周長優化的非球面CCP拋光
摘要 : 一種用于小直徑非球面 CCP 拋光的新概念,稱為Pea Puffer非球面,能夠生成那些對于大多數 CCP 拋光方法來說孔徑太小的非球面。Pea Puffer方法能夠在工業中以高質量
發表于 05-09 08:48
記憶示波器校準儀能校準哪些參數?
記憶示波器校準儀是一種綜合性電子計量標準儀器,能夠校準記憶示波器的多項關鍵參數,主要包括以下方面:1. 垂直系統參數
幅度校準:通過標準信號源輸出精確電壓,校準示波器的垂直靈敏度,確保幅度測量準確
發表于 04-11 14:05
一種分段氣隙的CLLC變換器平面變壓器設計
氣隙設計的優點。
目錄1 概述2 一種分段氣隙的CLLC平面變壓器設計3 實驗驗證4 參考文獻
1 概述學者們從LLC拓撲原理、新型器件、改進拓撲、先進調制方法、諧振參數優化方法、磁性
發表于 03-27 13:57
一種永磁電機用轉子組件制作方法
一種永磁電機所使用的轉子組件,是由磁鋼與芯軸組裝而成,產品工作轉速80 000 r /mi n,磁鋼相對于芯軸的同軸度要小于O.015 mm。現有的裝配方法是:先在芯軸兩端面制作中心孔,然后直接
發表于 03-25 15:20
一種優化的方法:記憶化搜索
評論