1. 程式人生 > >動態規劃入門(超詳細整理)

動態規劃入門(超詳細整理)

求解動態規劃問題求到最後無非就三種方法,見我之前的博文用三中方法詳細講解了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的一個模組,無需中間整合