動態規劃初探

2021-07-01 23:25:26 字數 1476 閱讀 5779

最先聽說動態規劃還是在研究生的最優控制課上,課上介紹了用動態規劃解決最優問題。其實動態規劃(dynamic programming/dp)和分治方法類似,都是通過組合子問題來求解原問題。不過動態規劃應用於問題重疊的情況,即不同的子問題具有公共的子子問題,每個子問題只求一次,而不必重新計算。

就我個人的理解:動態規劃就是將所求的問題分步,每一步的最優解是由當前解和之前的最優解組成。求到最後,也就求出了問題的乙個最優解,因為可會有多個最優解的情況。

應用dp的步驟:

1.刻畫乙個最優解的結構特徵

2.遞迴地定義最優值的解

3.計算最優值的解,通常採用自頂向上的方法

4.利用計算出的資訊構造乙個最優解

一.斐波那契數列問題

運用動態規劃解決的問題需要包括最優子結構或重疊子問題。下面就來舉乙個最常見的用到dp的問題----- fibonacci數列。

斐波那契數列問題,求f(n)的輸出,這是乙個最常見的問題,一般是運用遞迴來做,**如下:

public static int fibonacci(int n)
這是乙個遞迴函式,但是它的效率不高。假設我們求fibonacci(4),簡寫為f(4)。該遞迴函式的求解過程是這樣的

f(4)=f(3)+f(2);

f(3)=f(2)+f(1);

f(2)=f(1)+f(0);

這裡的f(2)和f(1)都求了兩遍,這裡重複求解,使得效率變低。可以使用動態規劃,因為這個問題具有重疊子問題。我們可以將之前求出的f(n)放在陣列中,而不用再去求它。定義乙個陣列f(n),用它來儲存每個斐波那契的值。**如下:  用陣列儲存以求得的子問題,用空間換時間。

public static int fibonacci(int n)

return f[n];

}

dp還用來解決如揹包問題,問題描述:給定n種物品和一揹包,物品i的重量是wi,其價值是pi,揹包的容量是m,問如何選擇裝入揹包中的物品總價值最大?這就是乙個最優問題的求解。這裡如何求解讀者可以自行思考,下面給出更常見到的演算法問題。

二.最長遞增子串行--lis

問題描述:有乙個長為n的數列a0,a1,a2........a(n-1)。請求出這個序列中最長的單增子序列的長度。單增子序列的定義是:對於任意的 i

這裡定義乙個陣列f[i],用來儲存陣列a[i]為末尾元素的最長子序列的長度。則f[0]=1; f[i]=max(f[j]

if(f[i]>length)   //求f[0]到f[i]的最大值

length=f[i];

}return length;

}這裡時間複雜度為o(n^2),其實還有更優的演算法使時間達到o(n*logn),不過不再是用動態規劃解決的。**如下:

public static int longsub(int a)

for(int i=0;i



動態規劃初探

為了解決多階段決策問題,我們可以使用窮舉法和動態規劃方法。但是當決策和階段數量達到一定程度後,窮舉法帶來的龐大計算量極大的降低了我們解決該類問題的效率。為了避免窮舉法帶來的龐大計算量,於是我們引入了動態規劃方法去解決該類問題。首先,我們需要了解什麼是多階段決策問題。這不難理解,這裡我舉個簡單的例子來...

動態規劃初探 揹包問題

在為期乙個星期的acm集訓之後,我就這樣做了乙個逃兵hhhh 在這乙個星期裡面,學長講了快速排序,二分三分搜尋,矩陣快速冪,線段樹,bfs 廣度優先搜尋 和dfs 深度優先搜尋 鄰接表和雜湊表,結構體和優先佇列,揹包問題和動態規劃。其中講快速排序那天我還在考試,就沒有去聽,第二天找學長的時候也聽得似...

動態SQL初探

1 普通sql 語句 select customerid,companyname,contactname,address city,phone from dbo.customers goexec select customerid,companyname,contactname,address ci...