動態規劃(多階段決策)
意義:求解決策過程最優化的數學方法
基本思想:將待求解的問題分為若干個階段,即若干個互相聯絡的子問題,在求解子問題的過程中逐步推導出原問題的解。
核心:在求解子問題的過程中,儲存子問題的解。
注1:動態規劃的思想實際上和遞迴相似。都是通過逐步推導,得到答案。而用它們解題時的核心也都是求出「遞推公式」
(類似 高中數學中數列的遞推公式an=a
n-1+n)
。但動態規劃和遞迴的一大區別是:動態規劃將遞迴的每一步的結果都儲存下來,在下次使用時直接呼叫而非重複運算。從而節省了大量的計算資源。
注2:最簡單的動態規劃可以通過建立乙個快取陣列配合略微修改原遞迴函式來實現。只要將遞迴過程中得到的解存入快取陣列,並在遞迴求解的過程中優先在快取陣列中尋找結果。就能避免重複的運算,使遞迴函式的效率大大提高。這實際上就是「用空間換時間」的方法。
遞迴和動態規劃的區別:
遞迴:對於求f(n)時,通過f(n)和f(n-1)的關係,迴圈縮減n的值,最終到達f(1)或f(0)等數量級時,給出答案。再通過給出的答案,迴圈計算出f(n)的值
(如f(1)=1,則可以通過f(n)=f(n-1)+1得出f(2)=2)。
計算f(n)需要f(n-1),計算f(n-1)需要f(n-2)...計算f(2)需要f(1)。f(1)=1所以f(n)=...;
動態規劃:建立迴圈i=1~i=n,然後直接通過f(1)的值迴圈計算f(i),最終得到f(n)。
計算f(n)需要用到f(1)到f(n-1)所有的值,所以
直接迴圈計算從f(2)到f(n-1)的所有值並儲存
。則當需要f(n)的值時,就可以直接取用需要的值了,避免了大量重複的迴圈。
對於以下
圓代表地點,圓內的數字代表地點編號,圓間的箭頭代表通路,箭頭上的數字代表開銷
要求求從0到6的最小開銷。
**示例:
#include #include /**/
#define n 7
#define x 9999
/*建立地圖陣列,map[i][j]=n代表i和j點直接的開銷為n,將x作為乙個大數填充入不可通行的路徑*/
int map[n][n]=
, ,,,
,,};int main()
;//path用於儲存當前點的最小開銷路徑的上乙個點
int i,j;
int mincost,minnode;
cost[0]=0;
/*迴圈計算每乙個點的最小開銷*/
for(i=1;i結果:
解析:
以上即是使用了動態規劃原理的解題。
**示例:
#include #include /*
描述需要你做的就是寫乙個程式,得出最長公共子串行。
tip:最長公共子串行也稱作最長公共子串(不要求連續),
英文縮寫為lcs(longest common subsequence)。
其定義是,乙個序列 s ,如果分別是兩個或多個已知序列的子串行,
且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。
輸入第一行給出乙個整數n(00);
char ch2[100]=;
scanf("%s",ch1);
scanf("%s",ch2);
/*lcs陣列用於動態規劃*/
int lcs[100][100];
int i,j;
for(i=0;ilcs[i+1][j]?lcs[i][j+1]:lcs[i+1][j];}}
/*輸出結果*/
printf("%d\n",lcs[strlen(ch1)][strlen(ch2)]);
}return 0;
}
結果:
解析:
1.對於兩個序列s1:,s2:。
任取其中的兩個元素xk,yv(k不一定等於v)。
設lcs(n,m)為s1,s2的最大公共子串行的長度n,m分別代表取s1、s2序列的前n、m項加入考量 則
當xk=yv,lcs(k,v)=lcs(k-1,v-1)+1;
(如果xk=yv,則xk和yv必然是最大公共子串行的一部分,所以將上一層的最大公共子串行記錄的長度加一)
當xk!=yv,lcs(k,v)=max(lcs(k-1,v),lcs(k,v-1));
(如果xk!=yv,嘖xk和yv必然不能同時作為最大公共子串行的一部分,所以將只取xk的情況和只取yv的情況分別討論,並將兩種的大值作為當前的最大公共子串行長度)
且,k/v任意乙個等於0時,
lcs(k,v)=0
(k/v任意乙個等於0,則其中乙個字串為空,自然不可能有公共子串行)
以上即**核心演算法。
2.使用動態規劃原理逐層計算lcs陣列,最終得到期望的結果。
學習筆記 動態規劃
bullet 先來看乙個問題 小張現在有8個任務可選,每個任務都必須在規定的時間段完成不能多也不能少,而且每個任務都有對應的報酬如下圖,問小張應如何選擇才能拿到最多的報酬?那我們換種方法來解決這個問題吧,首先,每個任務都有選和不選兩種選擇,我們從最後乙個任務開始模擬這個過程。首先我們需要先用乙個陣列...
動態規劃學習筆記
最近開始學習動態規劃演算法,我的理解是動態規劃演算法是乙個用空間換時間的演算法,常用在一些求最解 計數 判斷有無等問題中,且這些問題都存在大量重複的計算。動態規劃的思想就是將已經計算過的資料儲存起來,在下次用到時可以直接取用,這樣就消除了重複計算。而且這也是體現 動態 的地方,就是能根據之前情況進行...
動態規劃學習筆記
案例1 最長回文序列 乙個字串有許多子串行,比如字串abcfgbda,它的子串行有a bfg bfgbd,在這些子串行中肯定有回文字串。現在要對任意 字串求其最長的回文子串行。注意,本文不是解決最長回文子串,回文子串是連續的,回文子串行是不連續的。字串abcfgbda 的最長回文子串行為abcba,...