动态规划做多了以后,总结的相关知识
動(dòng)態(tài)規(guī)劃 Dynamic Programming DP
?
準(zhǔn)則
動(dòng)態(tài)規(guī)劃的本質(zhì),是對(duì)問題狀態(tài)的定義和狀態(tài)轉(zhuǎn)移方程的定義。
動(dòng)態(tài)規(guī)劃是通過拆分問題,定義問題狀態(tài)和狀態(tài)之間的關(guān)系,使得問題能夠以遞推(或者說分治)的方式去解決。
如何拆分問題,才是動(dòng)態(tài)規(guī)劃的核心。
而拆分問題,靠的就是狀態(tài)的定義和狀態(tài)轉(zhuǎn)移方程的定義。
?
以LIS為例,重新定義這個(gè)問題:
給定一個(gè)數(shù)列,長(zhǎng)度為N,
設(shè)F_{k}為:以數(shù)列中第k項(xiàng)結(jié)尾的最長(zhǎng)上升子序列的長(zhǎng)度.
求F_{1}..F_{N} 中的最大值.
對(duì)于F_{k}來講,F_{1} .. F_{k-1}都是F_{k}的子問題:因?yàn)橐缘趉項(xiàng)結(jié)尾的最長(zhǎng)遞增子序列(下稱LIS),包含著以第1..k-1中某項(xiàng)結(jié)尾的LIS。
?
上述的新問題F_{k}也可以叫做狀態(tài),定義中的“F_{k}為數(shù)列中第k項(xiàng)結(jié)尾的LIS的長(zhǎng)度”,就叫做對(duì)狀態(tài)的定義。
之所以把F_{k}做“狀態(tài)”而不是“問題” ,一是因?yàn)楸苊飧瓎栴}中“問題”混淆,二是因?yàn)檫@個(gè)新問題是數(shù)學(xué)化定義的。
?
上述狀態(tài)定義好之后,狀態(tài)和狀態(tài)之間的關(guān)系式,就叫做狀態(tài)轉(zhuǎn)移方程。
比如,對(duì)于LIS問題,狀態(tài)轉(zhuǎn)移方程為:
以第k項(xiàng)結(jié)尾的LIS的長(zhǎng)度是:保證第i項(xiàng)比第k項(xiàng)小的情況下,以第i項(xiàng)結(jié)尾的LIS長(zhǎng)度加一的最大值,取遍i的所有值(i小于k)。
?
a. “緩存”,“重疊子問題”,“記憶化”
這三個(gè)名詞,都是在闡述遞推式求解的技巧。以Fibonacci數(shù)列為例,計(jì)算第100項(xiàng)的時(shí)候,需要計(jì)算第99項(xiàng)和98項(xiàng);在計(jì)算第101項(xiàng)的時(shí)候,需要第100項(xiàng)和第99項(xiàng),這時(shí)候你還需要重新計(jì)算第99項(xiàng)嗎?不需要,你只需要在第一次計(jì)算的時(shí)候把它記下來就可以了。上述的需要再次計(jì)算的“第99項(xiàng)”,就叫“重疊子問題”。如果沒有計(jì)算過,就按照遞推式計(jì)算,如果計(jì)算過,直接使用,就像“緩存”一樣,這種方法,叫做“記憶化”,這是遞推式求解的技巧。這種技巧,通俗的說叫“花費(fèi)空間來節(jié)省時(shí)間”。都不是動(dòng)態(tài)規(guī)劃的本質(zhì),不是動(dòng)態(tài)規(guī)劃的核心。
b. “自上而下”,“自下而上”
“遞歸”:遞歸是遞推式求解的方法,連技巧都算不上。
怎么實(shí)現(xiàn)dp?答:兩種常用的方法。(僅僅涉及一般問題)?????
?1. 自下而上:通過正向的loop,求出所有狀態(tài)對(duì)應(yīng)的值,然后找出max或者min。???????????? 優(yōu)缺點(diǎn):速度慢,但是相對(duì)節(jié)省空間。?????
2. 自上而下:通過遞歸的方法,需要求解f(x),則必須知道f(y),要知道f(y),必須求f(z).??????????? 優(yōu)缺點(diǎn):速度快,只用算需要的值,但是要調(diào)用堆棧,浪費(fèi)空間。
?
c. "無后效性",“最優(yōu)子結(jié)構(gòu)”
上述的狀態(tài)轉(zhuǎn)移方程中,等式右邊不會(huì)用到下標(biāo)大于左邊i或者k的值,這是"無后效性"的通俗上的數(shù)學(xué)定義,符合這種定義的狀態(tài)定義,我們可以說它具有“最優(yōu)子結(jié)構(gòu)”的性質(zhì),在動(dòng)態(tài)規(guī)劃中我們要做的,就是找到這種“最優(yōu)子結(jié)構(gòu)”。
每個(gè)階段的最優(yōu)狀態(tài)可以從之前某個(gè)階段的某個(gè)或某些狀態(tài)直接得到
這個(gè)性質(zhì)叫做最優(yōu)子結(jié)構(gòu);
而不管之前這個(gè)狀態(tài)是如何得到的
這個(gè)性質(zhì)叫做無后效性。
在對(duì)狀態(tài)和狀態(tài)轉(zhuǎn)移方程的定義過程中,滿足“最優(yōu)子結(jié)構(gòu)”是一個(gè)隱含的條件(否則根本定義不出來)。
d. 關(guān)于復(fù)雜度的分析
時(shí)間復(fù)雜度O (狀態(tài)數(shù) * 每個(gè)狀態(tài)下所對(duì)應(yīng)的決策數(shù))。
空間復(fù)雜度O (狀態(tài)數(shù))。
總結(jié)
以上是生活随笔為你收集整理的动态规划做多了以后,总结的相关知识的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 后缀树/后缀数组
- 下一篇: leetcode344. 反转字符串 史