∙
\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,...