初聞動態規劃

前言

本文以一道常見的算法面試題開篇,引入動態規劃的基礎概念, 介紹其思考過程。

正文

一、常見的一道算法面試題——上臺階

有一個樓梯總共n個臺階,只能往上走,每次只能上1個、2個臺階,總共有多少種走法。

解決方案

1、排列組合;

枚舉2的個數,再枚舉2具體放的位置;

計算復雜,容易遺漏。

2、動態規劃;

dp[n] 表示n個臺階的走法,那么有:

dp[n]=dp[n-1]+dp[n-2];

思路清晰,代碼簡單。

二、動態規劃基礎概念

1、動態規劃;

動態規劃(Dynamic Programming)指的是解最優化問題的一種方法。

2、最優子結構性質;

問題的最優解可以分解為若干子問題,且子問題的解也是最優的;

以上臺階為例,到第i層的最多走法,可以分解為第i-1層和第i-2層的走法之和,且第i-1層和第i-2層的走法也是最多的;

3、 無后效性;

現階段的決策不會影響未來的決策;

以上臺階為例,走到第i-2層的最多走法,不會因為增加第i-1層而改變;

三、動態規劃思考過程

動態規劃的思考過程可以總結為:大事化小,小事化了

大事化小

一個較大的問題,通過找到與子問題的重疊,把復雜的問題劃分為多個小問題,也稱為狀態轉移;

小事化了

小問題的解決通常是通過初始化,直接計算結果得到;

具體的步驟

1、將大問題分解為子問題

2、確定狀態表示

3、確定狀態轉移

4、考慮初始狀態和邊界情況

四、另一個經典的例子——數塔

有如圖所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?

這里寫圖片描述

解決思路

1、大事化小。要到達第i層,先要到達第i-1層。并且第i層的第j個節點,只能由i-1層的第j個和第j-1個節點到達。

我們用dp[i][j]表示,走到第i層第j個位置的數字最大和。

那么有dp[i][j]=max(dp[i-1][j], dp[i-1][j-1]) + a[i][j];

2、小事化了。第1層的第1個節點,初始值為dp[1][1]=a[1][1]。(a[x][y]表示第x層,第y個的值)

五、數塔例子的變形——收集蘋果

平面上有N*M個格子,每個格子中放著一定數量的蘋果。

你從左上角的格子開始,每一步只能向下走或是向右走,每次走到一個格子上就把格子里的蘋果收集起來。這樣下去,你最多能收集到多少個蘋果。

解決思路

1、只能向右走或者向下走,要到達第i行第j列的格子的時候,可以由第i-1行第j列或者第i行第j-1列到達,我們用dp[i][j]表示,走到第i行第j列的最多蘋果數,那么有:

dp[i][j]=max(dp[i-1][j], dp[i][j-1]) + a[i][j];

2、第1行第1列,初始值為dp[1][1]=a[1][1],注意事項是邊界條件的處理。

六、動態規劃經典——01背包問題

給定n件物品和一個容量為m的背包,每件物品都會消耗背包的一定容積c[i],并帶來一定價值v[i],要求如何選取裝入背包中的物品,使得背包內的物品價值最大。

解決思路

把n件物品放入背包,可以分解為“將前i件物品放入容量為m的背包中”問題。

若只考慮第i件物品的選擇,那么問題可以分為兩種情況:

1、如果不放第i件物品,問題就轉化為“前i-1件物品放入容量為v的背包中”;

2、如果放第i件物品,問題就轉化為“前i-1件物品放入剩下的容量為m-c[i]的背包中”;

我們用f[i][j]表示前i個物品,放入容量為j的背包的最大價值,上面的兩種情況可以表示為

f[i][j] = max(f[i-1][j], f[i-1][j-c[i]]+v[i]);

初始化條件memset(dp, 0, sizeof(dp));和dp[1][c[1]]=v[1]。

最后遍歷f[n][1~m]可以得到最大值。

總結

如果還不能完全理解01背包,那么還需要再仔細理解最優子結構、狀態表示和狀態轉移。

算法能擴展思考方向,完善思維能力。學會“上臺階”、“數塔”、“01背包”這三個題目,能解決算法面試的動態規劃部分。

參考及引用

程序員算法基礎——動態規劃

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

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

相關文章

FFmpeg源代碼簡單分析-通用-結構體分析-AVCodec

參考鏈接 FFMPEG結構體分析:AVCodec_雷霄驊的博客-CSDN博客_avcodec AVCodec AVCodec是存儲編解碼器信息的結構體結構體的定義位于avcodec.h文件中最主要的幾個變量 const char *name:編解碼器的名字,比較短const char *long_name&#xff…

SLF4J簡介與使用(整合log4j)

SLF4J簡介與使用(整合log4j) 一、概念 SLF4J的全稱是Simple Logging Facade for Java,即簡單日志門面。SLF4J并不是具體的日志框架,而是作為一個簡單門面服務于各類日志框架,如java.util.logging, logback和log4j。 SLF4J提供了統一的記錄…

multism中ui和uo應該怎么表示_王者榮耀:夢淚直播時談到體驗服大改動,表示裝備的改動很關鍵...

王者榮耀的主播夢淚,大家都很熟了,也是一個很強的主播,他對于王者榮耀的理解,還是非常深刻的,而最近王者榮耀的體驗服,進行了大改動,也是改變了很多的東西。對此,網友們也是非常的在…

FFmpeg源代碼簡單分析-通用-結構體分析-AVStream

參考鏈接 FFMPEG結構體分析:AVStream_雷霄驊的博客-CSDN博客_avstream AVStream AVStream是是存儲每一個視頻/音頻流信息的結構體結構體的定義位于avformat.h重要參數介紹 int index:標識該視頻/音頻流AVCodecContext *codec:指向該視頻/音…

在Windows下安裝JDK的通常步驟

獲取安裝包 從官網或其他途徑下載JDK的Windows版本的安裝包,并點擊安裝。安裝向導中無需選擇配置項,默認操作即可,除了自定義的JDK安裝目錄。假設JDK的安裝目錄為C:\Program Files\Java。 設置環境變量 右擊桌面上的計算機,在菜單…

怎么關閉或者卸載ivanti_電腦軟件卸載不了怎么辦,教您解決電腦軟件無法卸載方法技巧...

我們在使用電腦的過程中,肯定會安裝各種軟件,但是一些軟件在使用完之后就不會再使用了,但又無法卸載。下面由小編分享一下電腦安裝的軟件無法卸載解決方法,如果你在某卸載軟件的時候出現無法卸載的情況,不妨通過以下方…

FFmpeg源代碼簡單分析-通用-結構體分析-AVPacket

參考鏈接 FFMPEG結構體分析:AVPacket_雷霄驊的博客-CSDN博客_avpacket AVPacket AVPacket是存儲壓縮編碼數據相關信息的結構體結構體的定義位于packet.h重要參數介紹 uint8_t *data:壓縮編碼的數據。例如對于H.264來說。1個AVPacket的data通常對應一個…

h5支付不能打開支付寶 ios_iOS WKWebview中無法調起支付寶/微信客戶端支付問題的解決方法...

這兩個的解決思路都是要在下面這個方法中先攔截相應的url,再單獨處理- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;支付寶…

解決Github圖片加載失敗

問題描述 瀏覽自己Github某倉庫的README.md內時,發現文檔的圖片始終加載不出,打開瀏覽器后臺,冒出一片紅,Failed to load resource: net::ERR_CONNECTION_RESET,如下圖所示: 問題分析 可能造成這問題的原…

FFmpeg源代碼簡單分析-通用-結構體分析-AVFrame

參考鏈接 FFMPEG結構體分析:AVFrame_雷霄驊的博客-CSDN博客 AVFrame AVFrame是包含碼流參數較多的結構體結構體的定義位于frame.hAVFrame結構體一般用于存儲原始數據(即非壓縮數據,例如對視頻來說是YUV,RGB,對音頻來…

python 求子字符串_(6)KMP算法(求子串的位置)______字符串的匹配

問題:已知字符串 B 是字符串 A 的一個子串,問字符串 B 在字符串 A 的第一次出現位置.暴力方法:從 A 字符串 的每個位置開始對字符串 B 進行匹配. 這種方法根據數據的不同 復雜度不同最高可以達到O( m*n ). (m,n分別為兩個字符串的長度)KMP算法:我們先來看…

用Python將多張圖片合并成一PDF文件

先前條件 需要安裝兩模塊:fpdf、PIL pip install fpdfpip install PIL 放碼過來 from fpdf import FPDF from PIL import Image import osdef makePdf(pdfFileName, listPages):cover Image.open(listPages[0])width, height cover.sizepdf FPDF(unit "…

FFmpeg源代碼簡單分析-通用-結構體分析-關鍵結構體之間的關系

參考鏈接 FFMPEG中最關鍵的結構體之間的關系_雷霄驊的博客-CSDN博客_ffmpeg 結構體關系 最關鍵的結構體可以分成以下幾類: 解協議(http,rtsp,rtmp,mms) AVIOContext,URLProtocol,URLContext主要存儲視音頻使用的協…

用Python下載文件

前提條件 需要事先安裝requests模塊: pip install requests 放碼過來 import requestsurl XXX #文件下載來源URL filename #下載到本地后新文件名 r requests.get(url) with open(filename, "wb") as code:code.write(r.content)實戰演習 從目標…

distenct oracle_Oracle的distinct關鍵字

distinct關鍵字用于從查詢的結果集中篩選出唯一值的記錄。我們通過示例來介紹distinct關鍵字的用法。一、生成測試數據用以下SQL創建超女基本信息表(T_GIRL),插入一些測試數據。create table T_GIRL(id char(4) not null, -- 編號name varchar2(30) not null, -- 姓…

FFmpeg源代碼簡單分析-通用-常見結構體的初始化和銷毀(AVFormatContext,AVFrame等)

參考鏈接 FFmpeg源代碼簡單分析:常見結構體的初始化和銷毀(AVFormatContext,AVFrame等)_雷霄驊的博客-CSDN博客 結構體 AVFormatContext:統領全局的基本結構體。主要用于處理封裝格式(FLV/MKV/RMVB等&…

python中object轉為float_object格式怎樣無損轉換成float64格式

這次給大家帶來object格式怎樣無損轉換成float64格式,object格式無損轉換成float64格式的注意事項有哪些,下面就是實戰案例,一起來看一下。在數據處理過程中比如從CSV文件中導入數據data_df pd.read_csv("names.csv")在處理之前一…

FFmpeg源代碼簡單分析-通用-avio_open2()

參考鏈接 FFmpeg源代碼簡單分析:avio_open2()_雷霄驊的博客-CSDN博客_avio_open avio_open2() 該函數用于打開FFmpeg的輸入輸出文件avio_open2()的聲明位于libavformat\avio.h文件中,如下所示。 /*** Create and initialize a AVIOContext for accessi…

用Tomcat構建一個簡單圖片服務器

前提條件 Tomcat 7.0.90 方法一&#xff1a;修改配置文件 在TOMCAT_HOME/conf/server.xml配置文件內的<Host>內添加一子標簽&#xff1a; <Context docBase"C:\exambase\" path"/img"/>方法二&#xff1a;添加Servlet 新建一應用&#xf…

flash靜態的農夫走路_健身神動作——你不知道的“農夫行走”

原標題&#xff1a;健身神動作——你不知道的“農夫行走”本期導讀握力是訓練中及其重要的一環&#xff0c;強大的握力會使你的訓練效果MAX&#xff0c;就像開了加速器一樣&#xff01;很多人把握力和前臂力量混為一談&#xff0c;主要使用腕彎舉提高握力。實際上&#xff0c;握…