這個動態規劃系列主要是給自己平時的練習做個記錄,寫部落格的過程也是乙個熟悉與提高的過程,記得有一句話,提高動態規劃能力最好的方法就是思考每乙個狀態和狀態轉移方程是怎麼來的,而寫部落格這麼個講述的過程,就要求我能真正理解到那樣一種思維過程,其次也是方便後來的初學者的學習吧,我個人是挺頭疼動態規劃的,前兩天接觸dp 然後去參加乙個校內的演算法比賽 有道很簡單的dp 居然沒做出來 事後看別人**才覺得 原來是這樣 **10幾行就搞定了。
好了 廢話不多說 開始正文
動態規劃(dynamic programming)是運籌學的乙個分支,是求解決策過程(decision process)最優化的數學方法。20世紀50年代初美國數學家r.e.bellman等人在研究多階段決策過程(multistep decision process)的優化問題時,提出了著名的最優化原理(principle of optimality),把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解,創立了解決這類過程優化問題的新方法--動態規劃(摘自360百科)
動態規劃型別的問題有三個關鍵的屬性1.狀態。2.基準情況 3.狀態轉移方程
重點就在這句話:把多階段過程轉化為一系列單階段問題,利用各階段之間的關係,逐個求解
解動態規劃題的第一步也是最重要的一步就是定義正確的狀態,狀態決定了子問題間的關係,而關係又決定了如何得出狀態轉移方程
狀態的定義要遵守兩個可使用動態規劃的準則:
(1)問題具有最優子結構性質。如果問題的最優解所包含的 子問題的解也是最優的,我們就稱該問題具有最優子結 構性質。
(2) 無後效性。當前的若干個狀態值一旦確定,則此後過程的演變就只和這若干個狀態的值有關,和之前是採取哪種手段或經過哪條路徑演變到當前的這若干個狀態,沒有關係。
第二點要特別注意,剛學動態規劃的時候特別容易犯的乙個錯誤就是定義了乙個不滿足「無後效性」的狀態,而通常的解決方案是對狀態新增乙個維度或多個維度以解決或者改變定義使之包含某種路徑,所以有時候維度的大小也一定程度上反應了問題的複雜程式。對於這個問題我將用乙個經典例子來說明
最長上公升子串行問題(lis)
描述:給出乙個序列a1,a2,a3,a4,a5,a6,a7....an,求它的乙個子串行(設為s1,s2,...sn),使得這個子串行滿足這樣的性質,s1
很可能第一次接觸動態規劃的人會這樣定義乙個狀態,dp[i]:長度為i的序列的最長上公升子串行的長度,但這是有問題的,假設你要從dp[i-1]得到dp[i] 那麼就要考慮到dp[i-1]中的某個最長上公升子串行是以什麼結尾的 才能判斷第i位是否可以和dp[i-1]中某個最長上公升子串行組成乙個新的長度+1的最長上公升子串行,明顯不滿足「無後效性」,而解決方式就是將」以哪一位的元素結尾」包含進我們的狀態 於是我們定義dp[i]為以第i位元素結尾的最長上公升子串行的長度,就滿足了「無後效性」
相應的 基準情況 dp[1]=1
狀態轉移方程:dp[i]=max(1<=j<=i-1,且第i位的元素大於第j位的元素)
下面正式開始我們的第乙個動態規劃程式
斐波那契數列(
fibbonacci number
),又稱**分割數列,指的是這樣乙個數列:0、1、1、2、3、5、8、13、21、34、……在數學上,斐波納契數列以如下被以遞迴的方法定義:f(0)=0,f(1)=1,f(n)=f(n-1)+f(n-2)(n≥2,n∈n*)
現在讓你編寫乙個程式 根據輸入的n,輸出對應的菲波拉契數,即f(n)
這個程式可以說是最簡單的動態規劃了,簡單在**呢?簡單在 題已經把狀態f(n):第n位的菲波拉契數,基準情況f(0)=0,f(1)=1,轉移方程f(n)=f(n-1)+f(n-2)(n≥2,n∈n*),這三大要素都告訴你了,而現在你只需要按照定義實現就好了,很簡單 對吧?
直接附上**:
#include"stdio.h"intmain
()while(1
)return0;
}
好了,第一篇結束,算是乙個開篇吧,第一次寫這種文章,也是剛接觸動態規劃,因為個人認為很多書籍的動態規劃的學習曲線是很陡峭的,而我身為乙個新人,也沒多好的數學基礎,相信我的乙個學習經歷的過程是相對來說平緩的,希望對大家有幫助,有時候文章中會經常引用其他大牛及百科的原話,每次都標註很麻煩,請原作者見諒。
另,菜雞一枚,說的不對請指出。
動態規劃入門
1 用 dp 做的題大多數返回值是int boolean,求max min,不能打亂原來輸入順序。2 動態規劃有兩個重要定義,乙個叫 optimal substructure 另乙個叫 overlap subproblem 各種排序 tree 類問題中,都會用到 divide conquer 的思想...
動態規劃入門
大家可以看看這篇文章dp,哪個更容易理解就看哪個!一 動態規劃的定義 動態規劃程式設計是一種針對於解決最優化問題的一種途徑 一種方法,而不是一種特殊演算法,也就是說它沒有固定的模板。在動態規劃中,每走一步都要看看能不能最優,而且動態規劃最擅長的就是多階段問題!二 動態規劃的基本概和基本模型構成 1....
動態規劃入門
學動態規劃自然要從數字三角形開始起步,那麼我們就先從數字三角形開始。數字三角形題目 有乙個由非負整數組成的三角形,第一行只有乙個數,除了最下行之外的每個數的左下方和右下方各有乙個數,如下圖所示 3 24 10 1 4 3 2 20 從第一行的數開始,每次可以往下或往右下走一格,直到走到最下行,把沿途...