动态规划概述
注:第一次看不需要全理解,以后動(dòng)態(tài)規(guī)劃做多了,再回來看看,會(huì)有更深的理解
先符上其它文章,看完這篇就可以開始看這些咯。
萌新: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? https://blog.csdn.net/hebtu666/article/details/79912328
入門: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://blog.csdn.net/hebtu666/article/details/79964233
初級(jí):(目前沒寫好) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://blog.csdn.net/hebtu666/article/details/80212624
中級(jí): ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://blog.csdn.net/hebtu666/article/details/81290789
2018hbcpc dp總結(jié) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?https://blog.csdn.net/hebtu666/article/details/80402820
HDU1029 HDU1087 HDU1176?HDU1257 POJ1458 https://blog.csdn.net/hebtu666/article/details/81390118
POJ2533 HDU1114 HDU1260 HDU1160 ? ? ? ? ? ? ? ? ? https://blog.csdn.net/hebtu666/article/details/81393716
HDU1069 POJ3616 POJ1088 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??https://blog.csdn.net/hebtu666/article/details/81811310
POJ1189 UVA12511 HDU2845 HBCPC2018 K ? ? ? ?https://blog.csdn.net/hebtu666/article/details/81837461
概述:動(dòng)態(tài)規(guī)劃算法通常用于求解具有某種最優(yōu)性質(zhì)的問題。在這類問題中,可能會(huì)有許多可行解。每一個(gè)解都對(duì)應(yīng)于一個(gè)值,我們希望找到具有最優(yōu)值的解。動(dòng)態(tài)規(guī)劃算法與分治法類似,其基本思想也是將待求解問題分解成若干個(gè)子問題,先求解子問題,然后從這些子問題的解得到原問題的解。與分治法不同的是,適合于用動(dòng)態(tài)規(guī)劃求解的問題,經(jīng)分解得到子問題往往不是互相獨(dú)立的。若用分治法來解這類問題,則分解得到的子問題數(shù)目太多,有些子問題被重復(fù)計(jì)算了很多次。如果我們能夠保存已解決的子問題的答案,而在需要時(shí)再找出已求得的答案,這樣就可以避免大量的重復(fù)計(jì)算,節(jié)省時(shí)間。我們可以用一個(gè)表來記錄所有已解的子問題的答案。不管該子問題以后是否被用到,只要它被計(jì)算過,就將其結(jié)果填入表中。這就是動(dòng)態(tài)規(guī)劃法的基本思路。具體的動(dòng)態(tài)規(guī)劃算法多種多樣,但它們具有相同的填表格式。(摘自百度百科)
總結(jié)能用動(dòng)規(guī)解決的問題的特點(diǎn) :
1) 問題具有最優(yōu)子結(jié)構(gòu)性質(zhì)。如果問題的最優(yōu)解所包含的 子問題的解也是最優(yōu)的,我們就稱該問題具有最優(yōu)子結(jié) 構(gòu)性質(zhì)。
2) 無后效性。當(dāng)前的若干個(gè)狀態(tài)值一旦確定,則此后過程 的演變就只和這若干個(gè)狀態(tài)的值有關(guān),和之前是采取哪 種手段或經(jīng)過哪條路徑演變到當(dāng)前的這若干個(gè)狀態(tài),沒 有關(guān)系。?
?
動(dòng)規(guī)解題的一般思路?
例子:?
? ? ? ? ? ? ? ? ?7
? ? ? ? ? ? ?3 ? ?8 ? ? ? ?
? ? ? ? ? 8 ? ?1 ? ?0 ? ?
? ? ? ?2 ? ?7 ? ?4 ? ?4
? ? ?4 ? ?5 ? 2 ? 6 ? ? 5 ?
在上面的數(shù)字三角形中尋找一條從頂部到底邊的路徑,使得 路徑上所經(jīng)過的數(shù)字之和最大。路徑上的每一步都只能往左下或 右下走。只需要求出這個(gè)最大和即可,不必給出具體路徑。?
用二維數(shù)組存放數(shù)字三角形。?
?
?D( r, j) ? : 第r行第 j 個(gè)數(shù)字(r,j從1開始算) ?
MaxSum(r, j) : ? 從D(r,j)到底邊的各條路徑中?最佳路徑的數(shù)字之和。 ?
問題:求 MaxSum(1,1)?
?
D(r, j)出發(fā),下一步只能走D(r+1,j)或者D(r+1, j+1)。故對(duì)于N行的三角形:?
?
? if ( r == N) MaxSum(r,j) = D(r,j) ?
else ?MaxSum( r, j) = Max{ MaxSum(r+1,j), MaxSum(r+1,j+1) } + D(r,j)?
1. 將原問題分解為子問題?
?
? 把原問題分解為若干個(gè)子問題,子問題和原問題形式相同 或類似,只不過規(guī)模變小了。子問題都解決,原問題即解 決(數(shù)字三角形例)。
? 子問題的解一旦求出就會(huì)被保存,所以每個(gè)子問題只需求 解一次。?
2. 確定狀態(tài)?
?
? 在用動(dòng)態(tài)規(guī)劃解題時(shí),我們往往將和子問題相 關(guān)的各個(gè)變量的一組取值,稱之為一個(gè)“狀 態(tài)”。一個(gè)“狀態(tài)”對(duì)應(yīng)于一個(gè)或多個(gè)子問題, 所謂某個(gè)“狀態(tài)”下的“值”,就是這個(gè)“狀 態(tài)”所對(duì)應(yīng)的子問題的解。?
所有“狀態(tài)”的集合,構(gòu)成問題的“狀態(tài)空間”。“狀態(tài) 空間”的大小,與用動(dòng)態(tài)規(guī)劃解決問題的時(shí)間復(fù)雜度直接相關(guān)。 在數(shù)字三角形的例子里,一共有N×(N+1)/2個(gè)數(shù)字,所以這個(gè) 問題的狀態(tài)空間里一共就有N×(N+1)/2個(gè)狀態(tài)。 ? ? ? ? 整個(gè)問題的時(shí)間復(fù)雜度是狀態(tài)數(shù)目乘以計(jì)算每個(gè)狀態(tài)所需 時(shí)間。 ? ? ? ? ? ? 在數(shù)字三角形里每個(gè)“狀態(tài)”只需要經(jīng)過一次,且在每個(gè) 狀態(tài)上作計(jì)算所花的時(shí)間都是和N無關(guān)的常數(shù)。
?
??用動(dòng)態(tài)規(guī)劃解題,經(jīng)常碰到的情況是,K個(gè)整型變量能 構(gòu)成一個(gè)狀態(tài)(如數(shù)字三角形中的行號(hào)和列號(hào)這兩個(gè)變量 構(gòu)成“狀態(tài)”)。如果這K個(gè)整型變量的取值范圍分別是 N1, N2, ……Nk,那么,我們就可以用一個(gè)K維的數(shù)組 array[N1] [N2]……[Nk]來存儲(chǔ)各個(gè)狀態(tài)的“值”。
?
3. 確定一些初始狀態(tài)(邊界狀態(tài))的值?
?
? ? ? 以“數(shù)字三角形”為例,初始狀態(tài)就是底邊數(shù)字,值 就是底邊數(shù)字值。?
4. 確定狀態(tài)轉(zhuǎn)移方程?
?
? ? ? ?定義出什么是“狀態(tài)”,以及在該 “狀態(tài)”下的“值”后,就要 找出不同的狀態(tài)之間如何遷移――即如何從一個(gè)或多個(gè)“值”已知的 “狀態(tài)”,求出另一個(gè)“狀態(tài)”的“值”(“人人為我”遞推型)。狀 態(tài)的遷移可以用遞推公式表示,此遞推公式也可被稱作“狀態(tài)轉(zhuǎn)移方 程”。
?
做題做多了再回來看看這篇概念,有不一樣的體會(huì)。
??
總結(jié)
- 上一篇: 关系数据库——基础
- 下一篇: SPI、I2C、UART 三种串行总线对