【动态规划】关于转移方程的简单理解
什么是動(dòng)態(tài)規(guī)劃,我們要如何描述它?
動(dòng)態(tài)規(guī)劃算法通常基于一個(gè)遞推公式及一個(gè)或多個(gè)初始狀態(tài)。當(dāng)前子問題的解將由上一次子問題的解推出。使用動(dòng)態(tài)規(guī)劃來解題只需要多項(xiàng)式時(shí)間復(fù)雜度,因此它比回溯法、暴力法等要快許多。
這里所說的子問題并不一定指前一個(gè)問題的解
比如說1+2+3+。。。+100,我們這里可以sum[i]+100來求出總和,而sum[i]是1加到i的總和,這個(gè)問題就是1加到99的子問題再加上100就得到。
動(dòng)態(tài)規(guī)劃則并非是如此,它可能跟前面所有的子問題的某個(gè)解有聯(lián)系,舉個(gè)例子:
如果我們有面值為1元、3元和5元的硬幣若干枚,如何用最少的硬幣湊夠11元?
(表面上這道題可以用貪心算法,但貪心算法無法保證可以求出解,比如1元換成2元的時(shí)候)
首先我們思考一個(gè)問題,如何用最少的硬幣湊夠i元(i<11)?為什么要這么問呢?兩個(gè)原因:1.當(dāng)我們遇到一個(gè)大問題時(shí),總是習(xí)慣把問題的 規(guī)模變小,這樣便于分析討論。 2.這個(gè)規(guī)模變小后的問題和原來的問題是同質(zhì)的,除了規(guī)模變小,其它的都是一樣的,本質(zhì)上它還是同一個(gè)問題(規(guī)模變小后的問題其實(shí)是原問題的子問題)。
好了,讓我們從最小的i開始吧。當(dāng)i=0,即我們需要多少個(gè)硬幣來湊夠0元。由于1,3,5都大于0,即沒有比0小的幣值,因此湊夠0元我們最少需 要0個(gè)硬幣。 (這個(gè)分析很傻是不是?別著急,這個(gè)思路有利于我們理清動(dòng)態(tài)規(guī)劃究竟在做些什么。) 這時(shí)候我們發(fā)現(xiàn)用一個(gè)標(biāo)記來表示這句“湊夠0元我們最少需要0個(gè)硬幣。”會(huì)比較方便,如果一直用純文字來表述,不出一會(huì)兒你就會(huì)覺得很繞了。那么,我們用 d(i)=j來表示湊夠i元最少需要j個(gè)硬幣。于是我們已經(jīng)得到了d(0)=0,表示湊夠0元最小需要0個(gè)硬幣。當(dāng)i=1時(shí),只有面值為1元的硬幣可用, 因此我們拿起一個(gè)面值為1的硬幣,接下來只需要湊夠0元即可,而這個(gè)是已經(jīng)知道答案的,即d(0)=0。所 以,d(1)=d(1-1)+1=d(0)+1=0+1=1。當(dāng)i=2時(shí),仍然只有面值為1的硬幣可用,于是我拿起一個(gè)面值為1的硬幣,接下來我只需要再 湊夠2-1=1元即可(記得要用最小的硬幣數(shù)量),而這個(gè)答案也已經(jīng)知道了。所以d(2)=d(2-1)+1=d(1)+1=1+1=2。一直到這里,你 都可能會(huì)覺得,好無聊,感覺像做小學(xué)生的題目似的。因?yàn)槲覀円恢倍贾荒懿僮髅嬷禐?的硬幣!耐心點(diǎn),讓我們看看i=3時(shí)的情況。當(dāng)i=3時(shí),我們能用的硬 幣就有兩種了:1元的和3元的( 5元的仍然沒用,因?yàn)槟阈枰獪惖臄?shù)目是3元!5元太多了親)。既然能用的硬幣有兩種,我就有兩種方案。如果我拿了一個(gè)1元的硬幣,我的目標(biāo)就變?yōu)榱?#xff1a;湊夠 3-1=2元需要的最少硬幣數(shù)量。即d(3)=d(3-1)+1=d(2)+1=2+1=3。這個(gè)方案說的是,我拿3個(gè)1元的硬幣;第二種方案是我拿起一 個(gè)3元的硬幣,我的目標(biāo)就變成:湊夠3-3=0元需要的最少硬幣數(shù)量。即d(3)=d(3-3)+1=d(0)+1=0+1=1. 這個(gè)方案說的是,我拿1個(gè)3元的硬幣,這里d(3)值跟d(2)是沒有關(guān)系的,如果你還不理解,下面我們結(jié)合01背包來說明。好了,這兩種方案哪種更優(yōu)呢?記得我們可是要用最少的硬幣數(shù)量來湊夠3元的。所以,選擇d(3)=1,怎么來的呢? 具體是這樣得到的:d(3)=min{d(3-1)+1, d(3-3)+1}。
狀態(tài)和狀態(tài)轉(zhuǎn)移方程
從以上的文字中,我們要抽出動(dòng)態(tài)規(guī)劃里非常重要的兩個(gè)概念:狀態(tài)和狀態(tài)轉(zhuǎn)移方程。
狀態(tài):就是上面d(3)d(2)等,抽象d(i);
狀態(tài)轉(zhuǎn)移方程:d(3)=min{d(3-1)+1, d(3-3)+1},抽象d(i)=min{ d(i-vj)+1 },其中i-vj?>=0,vj表示第j個(gè)硬幣的面值;
總結(jié)
以上是生活随笔為你收集整理的【动态规划】关于转移方程的简单理解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Netty 5用户指南
- 下一篇: 【动态规划】分组背包