動態規劃入門(超詳細整理)
求解動態規劃問題求到最後無非就三種方法,見我之前的博文用三中方法詳細講解了01揹包問題。
看了這麼多再來簡單總結下什麼是動態規劃:
動態規劃,Dynamic Programming(此處“Programming”為“規劃”,而非指“程式”、“程式設計”),研究多步決策過程最優化問題的一種數學方法,英文縮寫DP。在動態規劃中,為了尋找一個問題的最優解(即最優決策過程),將整個問題劃分成若干個相應的階段,並在每個階段都根據先前所作出的決策作出當前階段最優決策,進而得出整個問題的最優解。
能採用動態規劃求解的問題的一般要具有3個性質:
最優化原理:如果問題的最優解所包含的子問題的解也是最優的,就稱該問題具有最優子結構,即滿足最優化原理。
無後效性:
有重疊子問題:即子問題之間是不獨立的,一個子問題在下一階段決策中可能被多次使用到。(該性質並不是動態規劃適用的必要條件,但是如果沒有這條性質,動態規劃演算法同其他演算法相比就不具備優勢)
解題步驟:
1. 拆分問題
2. 定義狀態(並找出初狀態)
3. 狀態轉移方程
題目講解:
C題數塔問題
有如下所示的數塔,要求從頂層走到底層,若每一步只能走到相鄰的結點,則經過的結點的數字之和最大是多少?
我們知道,從定點開始每次只有兩個方向,左下和右下,要想知道如何走才能得到最大值,我們只需要知道它的兩個子節點的如何走才能得到最大值,相同的情況我們又可以問它的子節點的子節點,這樣重複下去一直都愛最後一行。
故最後的狀態轉移方程式 dp[i][j] = num[i][j] + max(dp[i+1][j], dp[i+1][j+1]); 注意這是倒推的,就好像我們只有知道了地 i+1個才能知道第i個。仔細想一想為什麼遞推完成後dp[1][1]就是最大值呢?(從迴圈條件中找答案)
#include <bits/stdc++.h> using namespace std; const int MAXN = 100+10; int num[MAXN][MAXN]; int dp[MAXN][MAXN]; int main() { int t; scanf("%d", &t); while( t-- ) { memset(dp, 0, sizeof(dp)); int n; scanf("%d", &n); for( int i=1; i<=n; i++ ) { for( int j=1; j<=i; j++ ) scanf("%d", &num[i][j]); } for( int j=1; j<=n; j++ ) dp[n][j] = num[n][j]; for( int i = n-1; i >= 1; i-- ) { for( int j=1; j <= i; j++ ) { dp[i][j] = num[i][j] + max(dp[i+1][j], dp[i+1][j+1]); } } printf("%d\n", dp[1][1] ); } return 0; }
更多動態規劃例題講解關注我的其他博文。
推薦參考入門的題目講解:
相關推薦
動態規劃入門(超詳細整理)
求解動態規劃問題求到最後無非就三種方法,見我之前的博文用三中方法詳細講解了01揹包問題。 看了這麼多再來簡單總結下什麼是動態規劃: 動態規劃,Dynamic Programming(此處“Programming”為“規劃”,而非指“程式”、“程式設計”
動態規劃入門(一)
spa turn color and uil ott c++ erro 大數字 2017-09-01 11:29:43 writer:pprp 看sprout臺灣大學acm教學視頻的第一部分: 裏邊涉及到四道小例題 感覺很好就拿來寫了寫: 題意還有代碼說明都在代碼中: 1、
java程式設計師菜鳥進階(十三)linux基礎入門(一)vmvare下安裝linux RedHat圖解(超詳細篇)
對於linux,我從大二就想學習一下,但一直苦於無從下手,所以一直拖到現在,鑑於筆者瞭解很多人在linux入門的困難在何處,所以我認為本套入門基礎文章還是挺適合想學習linux的朋友,本系列文章大約十篇文章左右,近期會不斷更新下來,沒有linux基礎但又想學習linux的朋友可以關注一下本系列
動態規劃入門-(差不多一半借鑑左神)
其實從嚴格意義上說,動態規劃,並不是一種演算法,而是一種程式設計技巧,除去無關運算,降低時間複雜度。 舉個例子: 經典例子1-階乘: 遞迴實現:fac(x)=x*fac(x-1),臨界條件為x==0時,返回1。 以x==4時,解空間樹: 遞迴時由上往下延展,解問題時從
第一個SpringBoot入門級專案(超詳細步驟)
開發環境: MyEcplise2017+Maven+SpringBoot+Tomcat 8.5 ① 建立一個新的Maven專案:File-->New-->Others-->Maven Project
caioj1063·動態規劃入門(一維一邊推1:美元和馬克)
1063:動態規劃入門(一維一邊推1:美元和馬克) 時間限制: 1 Sec 記憶體限制: 128 MB 題目描述 【問題描述】 今天6:00起床,我轉身發現枕頭邊有100美元。 出門的時候發現門口有家冰淇淋店,拉了很長的橫幅:“今天100美元和4
動態規劃入門(二)DP 基本思想 具體實現 經典題目 POJ1088
(一) POJ1088,動態規劃的入門級題目。嘿嘿,連題目描述都是難得一見的中文。 題目分析: 求最長的滑雪路徑,關鍵是確定起點,即從哪開始滑。 不妨設以( i, j )為起點,現在求滑行的最長路徑。 首先,( i, j )能滑向的無非就是它四周比它低的點。到底滑向哪個點?
STM32學習筆記(超詳細整理144個問題)
1、AHB系統匯流排分為APB1(36MHz)和APB2(72MHz),其中2>1,意思是APB2接高速裝置; 2、Stm32f10x.h相當於reg52.h(裡面有基本的位操作定義),另一個為stm32f10x_conf.h專門控制外圍器件的配置,也就
Linux下Hadoop2.7.1集群環境的搭建(超詳細版)
目錄 hdfs cp命令 manage war 替代 share logs hadoop 本文旨在提供最基本的,可以用於在生產環境進行Hadoop、HDFS分布式環境的搭建,對自己是個總結和整理,也能方便新人學習使用。 一、基礎環境 在Linux上安裝Hadoop之前
Qt中純C++項目發布為dll的方法(超詳細步驟)
exe 程序 con ostream address 只需要 include free windows 眾所周知,我們可以將C++項目中的類以及函數導出,形成 .dll 文件,以供其他程序使用,下面將說明Qt環境下的使用方法。 首先創建共享庫,步驟如下:
getParameter和getAttribute區別(超詳細分析)
list 共享 ava 多個 設置 png 過程 技術分享 對象 getParameter和getAttribute區別(超詳細分析) (一)對getParameter過程,如下圖: (二)對getAttribute過程,如下圖 兩者區別: ①getPa
跟腱斷裂恢復訓練(超詳細版)
起因 我是北京交通大學一名讀計算機專業博士生,由於碩士同學畢業的緣故,我們幾個人就找了離大家都很近的籃球場(北京林業大學操場)打籃球。 2018年08月19日下午三點到操場以後,就開始了往常的對抗性籃球活動。第一,因為前一天開車腳腕的疲勞;第二,因為劇烈運
springboot啟動自定義banner--(佛祖版/千里馬版/悟空版/兔子版/龍舟版/美女版本) (超詳細教程)(多個自定義版本)
1在專案目錄下resource下新建banner.txt檔案 2在banner中新增圖案(任何字元圖案) 1:佛祖版 //////////////////////////////////////////////////////////////////// //
Maven安裝使用教程(超詳細附圖)
Maven的簡介 什麼是maven 是apache下的一個開源專案,是純java開發,並且只是用來管理java專案的 Maven好處 普通的傳統專案 Maven專案 分析:maven專案為什麼這麼小?沒有jar。 需要jar嗎?肯定需要。沒有
Qt中純C++專案釋出為dll的方法(超詳細步驟)
目錄 一般建立方法 匯出普通函式的方法&呼叫方法 匯出類及其成員函式的方法&呼叫方法 眾所周知,我們可以將C++專案中的類以及函式匯出,形成 .dll 檔案,以供其他程式使用,下面將說明Qt環境下的使用方法。 首先建立共享庫,步驟如下:
Linux系統基本命令(超詳細圖解)
一,目錄切換命令 window中通過圖形化介面和滑鼠可以任意切換需要進入的目錄,但Linux必須通過cd命令切換目錄。但在學習cd命令之前,我們有必要分清Linux的目錄結構(linux目錄結構詳細說明) cd usr 切換到該目錄下usr目錄 cd ../ 切換到上一
Windows 下 Redis叢集的搭建 ——(超詳細版)
1、下載並安裝Redis 本人安裝到C盤了,在C:\Redis 下建立Logs資料夾 , 然後在C:\Redis 建立 3個不同的Redis例項 ①、 redis.6380.co
caffe學習系列:訓練自己的圖片集(超詳細教程)
學習的caffe的目的,不是簡單的做幾個練習,而是最終落實到自己的專案或科研中去。因此,本文介紹一下,從自己的原始圖片到lmdb資料,再到訓練和測試的整個流程。 一、資料的準備 有條件的同學,可以去ImageNet的官網點選開啟連結,下載ImageNet圖片
獨家| 一文讀懂決策樹(超詳細原理)
最經典的決策樹演算法有ID3、C4.5、CART,其中ID3演算法是最早被提出的,它可以處理離散屬性樣本的分類,C4.5和CART演算法則可以處理更加複雜的分類問題,本文重點介紹ID3演算法。 1、決策樹基本流程 決策樹 (decision tree) 是一類常見的機器學習方法。它是對給定的
SpringMVC常見面試題總結(超詳細回答)
1、什麼是Spring MVC ?簡單介紹下你對springMVC的理解? Spring MVC是一個基於MVC架構的用來簡化web應用程式開發的應用開發框架,它是Spring的一個模組,無需中間整合