1. 程式人生 > >動態規劃解題的一般思路

動態規劃解題的一般思路

遞迴到動規的一般轉化方法

遞迴函式有n個引數,就定義一個n維的陣列,陣列的下表是遞迴函式引數的取值範圍,陣列元素的值是遞迴函式的返回值,這樣就可以從邊界值開始,逐步填充陣列,相當於計算遞迴函式值的逆過程

動規解題的一般思路

1.將原問題分解為子問題
把原問題分解為若干個子問題,子問題和原問題形式相同或類似,只不過規模變小了。子問題都解決,原問題即解決(數字三角形為例)。
子問題的解一旦求出就會被儲存,所以每個子問題只需求解一次。
2.確定狀態
在用動態規劃解題時,我們往往將和子問題相關的哥哥變數的一組取值,稱之為一個“狀態”。一個“狀態”對應於一個或多個子問題,所謂某個“狀態”下的“值”,就是這個“狀態”所對應子問題的解。
所有“狀態”的集合,構成問題的“狀態空間”。“狀態空間”的大小,與用動態規劃解決問題的時間複雜度直接相關。在數字三角形的例子裡,一共有N*(N+1)個狀態。
整個問題的時間複雜度是狀態數目乘以計算每個狀態所需要的時間。
用動態規劃解題,經常碰到的情況是,k個整型變數能構成一個狀態(如數字三角形中的行號和列號這兩個變數構成“狀態”)如果這K個整型變數的取值範圍分別是N1,N2,...Nk,那麼,我們就可以用一個k維的陣列array[N1][N2]...[Nk]來儲存各個狀態的“值”。這個“值”未必就是一個整數或浮點數,可能是需要一個結構才能表示的,那麼arrry就可以是一個結構陣列。一個“狀態”下的“值”通常會是一個或多個子問題的解。

3.確定一些初始狀態(邊界狀態)的值

以數字三角形為例,初始狀態就是底邊數字,值就是底邊數字值。

4. 確定狀態轉移方程

定義出什麼是“狀態”,以及在該“狀態”下的“值”後,就要找出不同的狀態之間如何遷移——即如何從一個或多個“值”已知的“狀態”,求出另一個“狀態”的“值”(“人人為我”遞推型)。狀態的遷移可以用遞推公式表示,此遞推公式也可被稱作“狀態轉移方程”。

能用動規解決的問題的特點

1) 問題具有最優子結構性質。如果問題的最優解所包含的子問題的解也是最優的,那麼我就稱該問題具有最優子結構性質。
2)無後效性。當前的若干個狀態值一旦確定,則此後過程的演變就只和這若干個狀態的值有關,和之前是採取哪種手段或經過哪條路徑演變到當前的若干個狀態,沒有關係

中國大學mooc 程式設計與演算法(二) 北京大學 郭煒

相關推薦

6.2 動態規劃解題一般思路

人人為我,就是已知指向人人,未知指向我,由已知推向未知的情況   來自演算法圖解: 揹包問題: 最長公共子串: 最長公共子序列: 1. 動態規劃可幫助你在給定約束條件

動態規劃解題一般思路

遞迴到動規的一般轉化方法 遞迴函式有n個引數,就定義一個n維的陣列,陣列的下表是遞迴函式引數的取值範圍,陣列元素的值是遞迴函式的返回值,這樣就可以從邊界值開始,逐步填充陣列,相當於計算遞迴函式值的逆過程 動規解題的一般思路 1.將原問題分解為子問題 把原

動態規劃解題報告

參考:動態規劃分類題目總結 一、基礎DP 1、遞推 、基礎 HDU2084 數塔【基礎DP】 HDU2018 母牛的故事【基礎DP】 HDU2044 一隻小蜜蜂...【基礎DP】 HDU2041 超級樓梯【基礎DP】 HDU2050 折線分割平面【基礎D

【演算法基礎】動態規劃解題例項之野營問題

問題描述: 假設你要去野營。你有一個容量為6磅的揹包,需要決定該攜帶下面的哪些東西。其中每樣東西都有相應的價值,價值越大意味著越重要: 水(重3磅,價值10) 書(重1磅,價值3) 食物(重2磅,價值9) 夾克(重2磅,價值5) 相機(重1磅,價值

動態規劃解題入門

動態規劃是一種演算法思想,剛入門的時候可能感覺十分難以掌握,總是會有看了題不知道怎麼做,但是一看答案就恍然大悟的感覺。結合這一段時間的學習,在這裡做一下總結。 解題思路 在解題的過程中,首先可以主動尋找遞推關係,比如對當前陣列進行逐步拉伸,看新的元素

一文學會動態規劃解題技巧

前言 動態規劃(dynamic programming,簡稱 dp)是工程中非常重要的解決問題的思想,從我們在工程中地圖軟體上應用的最短路徑問題,再在生活中的在淘寶上如何湊單以便利用滿減券來最大程度地達到我們合理薅羊毛的目的 ,很多時候都能看到它的身影。不過動態規劃對初學者來說確實比較難,dp狀態,狀態轉移方

動態規劃解題方法

魔幻的 2020 讓我們懷疑人生是否存在最優解?我們某個時間的決策究竟是否正確?歷史不能改變,但卻會重演,我們究竟要從過去中學到什麼呢? 讓我們一起從動態規劃中,來找尋這些問題的答案吧~ (咳咳,今天開始迴歸算法系列,來聊一聊之前的演算法文章中沒有講到的內容。 ## 什麼是動態規劃 動態規劃(Dyna

【演算法筆記】動態規劃,三個例題(解題思路與C++程式碼)

寫在前面,我想發個感慨:       當年大學時代ACM的時候,動態規劃演算法對鄙人來說一直算得上魔障,有時能敲出來程式碼,有時候狗咬刺蝟無從下嘴。       以至於一直認為動態規劃是ACM的代表演

運用動態規劃思想求解問題的一般思路

1.將原問題分解為子問題 將原問題分解為若干個子問題,子問題和原問題形式相同或類似,只不過規模變小了。子問題都解決,原問題即解決。 子問題的解一旦求出就會被儲存,所以每個子問題只需求解一次。 、 2.確定狀態 在用動態規劃解題時,我們往往將和子問題相關

動態規劃,揹包問題的解題思路

01揹包問題:         有n種物品,每種只有一個。第i種物品的體積為Vi,重量為Wi。選一些物品裝到一個容量為C的揹包,使得揹包內物品總體積不超過C的前提下重量儘可能的大。 1<=n<=100,1<=Vi<=C<=10000,1<

51nod 1270 數組的最大代價 思路:簡單動態規劃

i++ for end names bits image using idt color 這題是看起來很復雜,但是換個思路就簡單了的題目。 首先每個點要麽取b[i],要麽取1,因為取中間值毫無意義,不能增加最大代價S。 用一個二維數組做動態規劃就很簡單了。 d

簡單的動態規劃,數字三角形,以及做題思路

數值 space 鏈接 分析 ios style iostream 循環 turn 鏈接 一句話題目:給出一個n層的三角形,每個位置有一個數字,到達後可獲得,求到達最低層能達到的最大數字和。 題目分析: 首先我們考慮能不能用搜索做,因為對於一個坐標,我們只有向下

2018年暑假ACM個人訓練題9(動態規劃解題報告

三角形 img 背包 使用 狀態 記憶化 logs ref wid A:m段最大字段和問題https://www.cnblogs.com/yinbiao/p/9314528.htmlB:m

CCF201312-4有趣的數動態規劃思路總結

問題描述   我們把一個數稱為有趣的,當且僅當:   1. 它的數字只包含0, 1, 2, 3,且這四個數字都出現過至少一次。   2. 所有的0都出現在所有的1之前,而所有的2都出現在所有的3之前。   3. 最高位數字不為0。   因此,符合我們定義的最小的有趣的數是2

Leetcode解題筆記 5.Longest Palindromic Substring [Medium] 動態規劃解法

解題思路 題目要求我們尋找長度最長的子字串,考慮到由於題目符合運用動態規劃的3個性質——最優化原理、無後效性、有重疊子問題,所以可以用動態規劃的方法。難點在於構造如何設定子問題,怎麼初始化,以及怎麼遍歷。 構建子問題: 設d[i][j]表示字串s從第i

vijosp1037搭建雙塔-較為清晰簡單的思路-動態規劃01揹包-差值dp

2001年9月11日,一場突發的災難將紐約世界貿易中心大廈夷為平地,Mr. F曾親眼目睹了這次災難。為了紀念“9?11”事件,Mr. F決定自己用水晶來搭建一座雙塔。 Mr. F有N塊水晶,每塊水晶有一個高度,他想用這N塊水晶搭建兩座有同樣高度的塔,使他們成為一座雙塔,Mr. F可以從這N塊水晶中任取M(1

hdu 動態規劃(46道題目)傾情奉獻~ 【只提供思路與狀態轉移方程】(轉)

Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955     揹包;第一次做的時候把概率當做揹包(放大100000倍化為整數):在此範圍內最多能搶多少錢  最腦殘的是把總的概率以為是搶N家銀行的概率之和… 把狀

轉】HDU 動態規劃(46道題目)傾情奉獻~ 【只提供思路與狀態轉移方程】

Robberies http://acm.hdu.edu.cn/showproblem.php?pid=2955 揹包;第一次做的時候把概率當做揹包(放大100000倍化為整數):在此範圍內最多能搶多少錢 最腦殘的是把總的概率以為是搶N家銀行的概率之和… 把狀態轉移方程寫

Leetcode 120. Triangle 三角形問題(動態規劃經典) 解題報告

1 解題報告 首先我承認我很二哈,這道題我明明已經做過了,但是剛剛不知道為什麼又去做了一遍,而且我查了下兩次的解法還有所差別(貌似是現在的版本有進步了呢) 問題就是一個三角形的陣列,求從頂部到下方的最短路徑。。 這個問題是太過經典+Easy的DP問題了,哈

完美序列解題報告---動態規劃入門

完美序列 題目描述 已知一個長度為l的序列:b1,b2,b3,…,bl (1<=b1<=b2<=b3<=…<=bl<=n)。若這個序列滿足每個元素是它後續元素的因