學習筆記 動態規劃

2021-09-24 02:37:00 字數 3034 閱讀 3758

\bullet

∙先來看乙個問題:

小張現在有8個任務可選,每個任務都必須在規定的時間段完成不能多也不能少,而且每個任務都有對應的報酬如下圖,問小張應如何選擇才能拿到最多的報酬?

∙那我們換種方法來解決這個問題吧,

首先,每個任務都有選和不選兩種選擇,我們從最後乙個任務開始模擬這個過程。首先我們需要先用乙個陣列pre

prepr

e[ ],那麼pre

[i]pre[i]

pre[i]

表示在所有編號小於i

ii的任務中,編號最接i

ii近且時間段與iiii

ii12345

678pre

[i]pre[i]

pre[i]

0001

0235

開始模擬選與不選的過程:首先我們用乙個opt

optop

t[ ]陣列,opt

[i]opt[i]

opt[i]

表示第i

ii個任務能獲得的報酬的最優解(此最優解不表示第i

ii個任務的報酬)

第8個任務有兩種選擇:選第8個任務,那麼opt

[8]=

opt[

pre[

8]]+

任務8報

酬opt[8]=opt[pre[8]]+任務8報酬

opt[8]

=opt

[pre

[8]]

+任務8

報酬,它表示如果選了第8個任務,也選了之前的某個任務,那麼之前的某個任務就不能與第8個任務有時間衝突,所以這種情況下的第8個任務的報酬就是選了的之前某個任務的最優報酬+第8個任務的報酬;不選第8個任務,那麼第8個任務的最優報酬就等於第7個任務最優報酬。為了便於理解,我畫了乙個圖:

]表示第i

ii個任務的最優報酬,那麼上述過程就可以簡化為下面這個方程:

o pt

[i]=

maxopt[pre[i]]+gain[i], & \text \\ opt[i-1], & \text \end

opt[i]

=max

max(opt[pre[i]]+gain[i],opt[i-1] )&i>1 \\ gain[1]&i=1\\ 0&i=0 \end

opt[i]

=⎩⎪⎨

⎪⎧​m

ax(o

pt[p

re[i

]]+g

ain[

i],o

pt[i

−1])

gain

[1]0

​i>1i

=1i=

0​∙

\bullet

∙最後再來說一說動態規劃題目得特點即基本思想:對於乙個給定的問題,這個問題可以分解為若干性質相同或相似的子問題,且每個子問題都有其最優解的解決方法,那麼這個大問題的最優解就可以由若干個子問題的最優解結合得到。對於上述問題,我之所以要先從最後乙個任務來推,就是為了發現,這個大問題的最優解可以由它的子問題的最優解來得到,並且還發現了重疊子問題,這時就需要記憶化儲存,一旦某乙個子問題的最優解已解出,就需要將其記憶化儲存下來,以便下次再遇到同乙個子問題就可以直接查表,從而減少時間和空間複雜度。所以動態規劃常用於有重疊子問題和最優子結構的問題中。 當然動態規劃不常用遞迴來做,一旦求出了狀態轉移方程就可以用迭代來做。

\bullet

∙如何發現乙個問題是否能用動態規劃來做呢,首先要明白問題的最優解結構,以及子問題的最優解結構,如果它們的最優解結構相似或者相同的話,遞迴的模擬一下由大問題轉換為子問題的過程,看是否有重疊子問題以及遞迴出口等。最後再總結出來狀態轉移方程就好了。

之後再補上例題。。。。。

\bullet

∙來個簡單的例題:

在講述dp演算法的時候,乙個經典的例子就是數塔問題,它是這樣描述的:

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

input

輸入資料首先包括乙個整數c,表示測試例項的個數,每個測試例項的第一行是乙個整數n(1 <= n <= 100),表示數塔的高度,接下來用n行數字表示數塔,其中第i行有個i個整數,且所有的整數均在區間[0,99]內。

output

對於每個測試例項,輸出可能得到的最大和,每個例項的輸出佔一行。

sample input

157

3 88 1 0

2 7 4 4

4 5 2 6 5

sample output

30
狀態轉移方程:

#include

#include

#include

#include

using namespace std;

const

int maxn=

105;

int mp[maxn]

[maxn]

;int

main()

}for

(int i=n-

1;i>=

0;i--

)printf

("%d\n"

,mp[1]

[1])

;}return0;

}

學習筆記 動態規劃

動態規劃 多階段決策 意義 求解決策過程最優化的數學方法 基本思想 將待求解的問題分為若干個階段,即若干個互相聯絡的子問題,在求解子問題的過程中逐步推導出原問題的解。核心 在求解子問題的過程中,儲存子問題的解。注1 動態規劃的思想實際上和遞迴相似。都是通過逐步推導,得到答案。而用它們解題時的核心也都...

動態規劃學習筆記

最近開始學習動態規劃演算法,我的理解是動態規劃演算法是乙個用空間換時間的演算法,常用在一些求最解 計數 判斷有無等問題中,且這些問題都存在大量重複的計算。動態規劃的思想就是將已經計算過的資料儲存起來,在下次用到時可以直接取用,這樣就消除了重複計算。而且這也是體現 動態 的地方,就是能根據之前情況進行...

動態規劃學習筆記

案例1 最長回文序列 乙個字串有許多子串行,比如字串abcfgbda,它的子串行有a bfg bfgbd,在這些子串行中肯定有回文字串。現在要對任意 字串求其最長的回文子串行。注意,本文不是解決最長回文子串,回文子串是連續的,回文子串行是不連續的。字串abcfgbda 的最長回文子串行為abcba,...