動態(tài)規(guī)劃基礎(chǔ)和建模_第1頁
動態(tài)規(guī)劃基礎(chǔ)和建模_第2頁
動態(tài)規(guī)劃基礎(chǔ)和建模_第3頁
動態(tài)規(guī)劃基礎(chǔ)和建模_第4頁
動態(tài)規(guī)劃基礎(chǔ)和建模_第5頁
已閱讀5頁,還剩100頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

動態(tài)規(guī)劃基礎(chǔ)和建模

山東省濰坊第一中學(xué)秦政

clavichord

前言

*動態(tài)規(guī)劃是統(tǒng)籌學(xué)的重要內(nèi)容

*動態(tài)規(guī)劃是01的重要內(nèi)容

*據(jù)不完全統(tǒng)計(jì),每次考試動態(tài)規(guī)劃起碼有一道題

髡.

前言

*這個課件的目的:

*對動態(tài)規(guī)劃的模型進(jìn)行了一些總結(jié)

*有部分內(nèi)容超出了NOIP范圍

*為同學(xué)們提供一個刷題的方向

*請同學(xué)們踴躍發(fā)言

動忐規(guī)劃的基本概念

*階段

*狀態(tài)

*決策

*狀態(tài)轉(zhuǎn)移

*狀態(tài)轉(zhuǎn)移方程

動忐規(guī)劃的基本概念

*最優(yōu)子結(jié)構(gòu)

*無后效性原則

動忐規(guī)劃的基本概念

動忐規(guī)劃的基本概念

*實(shí)現(xiàn)方式:

*遞推:順推和逆推

*記憶化搜索

*前者靈活,優(yōu)化方法多

*后者可以減少不必要節(jié)點(diǎn)的計(jì)算

動忐規(guī)劃的基本概念

*時間復(fù)雜度:

*狀態(tài)數(shù)*轉(zhuǎn)移費(fèi)用

動忐規(guī)劃的模型

*線性模型

*區(qū)間模型

*矩形模型

*樹形模型

*背包模型

*圖狀模型

*SCDP

*多線程DP

*多重DP

*更廣泛的

線性模型

*單線問題:

*上樓梯問題

*LIS問題

*烏龜棋

*詩人小G(簡化版)

*雙線問題:

*LCS問題

*模糊匹配

上樓梯問題

*Zbwmqlw神薜要上樓梯,他一次可以上一層,也可

以兩°

*樓梯有n層

二有多少種上樓梯的方案

上樓梯問題

*N<=10A7?

*設(shè)f[i]表示到第i層得方案數(shù)

*前一步可以上一層也可以上兩層

*F[i]=f[i-i]+f[i-2]

*N<=10A15?

*矩陣乘法

US問題

*給定一個數(shù)列{an},求它的一個子序列{bm}

*滿足bi〈b2〈b3<???<bm

*使得m最大

*N<=10000

US問題

*設(shè)f[i]表示以i結(jié)尾的US的長度

*F[i]=max{f[j]]+i,j<iJLa[j]<a[i]

*時間復(fù)雜度?0(n八2)

*如何優(yōu)化?

US問題

*對于i來說,如果存在一個長度為len的US以i結(jié)尾,

那么也一定存在長度<len的

*即:滿足單調(diào)性!

*設(shè)g[i]表示的]二i的最小的a[j]

*二分g[k]>=a[i]的最大的k

*F[i]=k+1

*時間復(fù)雜度O(nlogn)

烏龜棋CN0IP20WtJ

?有一行長度為n+1的格子,編號。到n+1,要從第。個

格子的左邊出發(fā),到達(dá)第n個格子停止。每次可以向

右移動1到4格,分別可以操作G次

?求方案數(shù)

*保證£七1Q*i=n

?數(shù)據(jù)范圍:n<350,Ct<40

烏龜棋

*F[i][a][b][c][d]表示到位置i,四種操作分別進(jìn)行了

a,b,c,d次

決策有四種

*時間復(fù)雜度:0(ncA4)

*TLE+MLE

烏龜棋

?=n

*通過a,b,c,d可以推出1

*F[a][b][c][d]

*四種決策

*0(CA4)

詩人小GCNOI2OO9J簡化板

----.JBBBIgjjf

*一首詩包含了若干個句子,對于一些連續(xù)的短句,’…

可以將它們用空格隔開并放在一行中,注意一行中

可以放的句子數(shù)目是沒有限制的。小G給每首詩定

義了一個行標(biāo)準(zhǔn)長度(行的長度為一行中符號的總

個數(shù)),他希望排版后每行的長度都和行標(biāo)準(zhǔn)長度

相差不遠(yuǎn)。顯然排版時,不應(yīng)改變原有的句子順序,

并且小G不允許把一個句子分在兩行或者更多的行

內(nèi)。在滿足上面兩個條件的情況下,小G對于排版

中的每行定義了一個不協(xié)調(diào)度,為這行的實(shí)際長度與

行標(biāo)準(zhǔn)長度差值絕對值的P次方,而一個排版的不協(xié)

調(diào)度為所有行不協(xié)調(diào)度的總和。

*小6最近又作了幾首詩,現(xiàn)在請你對這首詩進(jìn)行排

版,使得排版后的詩盡量協(xié)調(diào)(即不協(xié)調(diào)度盡量

小),并把排版的結(jié)果告訴他。

詩人小G

*F[i]表示前i句詩的最小不協(xié)調(diào)度

*F[i]=min{f[j]+(sum[i]-sum[j]+i-j-L)Ap)

*時間復(fù)雜度0(nA2)

*優(yōu)化?

*導(dǎo)數(shù)證明四邊形不等式,有興趣的同學(xué)自己查閱有

關(guān)資料

LCS問題

*給定兩個字符串S,t

*求最長公共字串

*例:abcde和ace的LCS是ace

*N<=1000

LCS問題

*設(shè)可][口表示第一個串到i,第二個串到j(luò)的LCS

*F[i][j]=f[i-1][H]+1,s[i]<j]

*=min{f[i-i][j],f[i][M]},s[i]!=t[j]

*時間復(fù)雜度0(nA2)

模糊匹配(POJ1229)

*給定兩個字符串s和t,每個字符串有英文字母和*?!

組成,*?!的含義分別是:

**:匹配一個或多個字符;

*?:匹配至少一個至多三個字符;

*!:匹配至少三個字符。

*問兩個字符串是否能夠匹配。

*N<=1000

模糊匹配

耒重新定義通配符:

?匹配一個字符;

*#:匹配一個字符或者為空;

?$:匹配任意個字符或者為空。

?那么,題目中的三種通配符,我們可以轉(zhuǎn)化成這樣:

**T@$

??T@##

*!T@@@$

*然后,我們設(shè)了田田表示第一個字符串的前i個和第二個

字符串的前j個能否匹配,那么,我們可以分情況轉(zhuǎn)移

*與上一道題類似

*時間復(fù)雜度。(口?)。

區(qū)間模型

*石子歸并

*回文詞

決斗問題

*Blocks

石子歸并

*有n堆石子,第i堆重a[i]

*每次可以合并相鄰兩堆

*合并費(fèi)用為新堆的重量

*求合并成一堆的最小費(fèi)用

*N<=200

石子歸并

*合并的費(fèi)用是一段的和

*設(shè)孔口口]表示合并i到j(luò)的一段

*F[i][j]=min{f[i][k]+f[k+i][j])+sum[i][j]

*時間復(fù)雜度0(r1A3)

回文詞CI0I2000J

*給定一個字符串S,要求添加最少的字符,使得s成

為一個回文串。

*N〈二5。00

回文詞

*abcba:回文

*abcbc:不回文

*表示i到j(luò)變成回文的最小代價

*F[i][j]<i+1][H],s[i]=s[j]

*=min{f[i+i][j],f[i][j-i]}+i,s[i]!=s[j]

*時間復(fù)雜度0(n八2)

決斗問題CPOI99J

*1\1個人排成一圈,他們要決斗N-1場,其中相鄰的兩

人決斗(即第i個人與第i+1個人決斗,第N個人與第1

個人決斗),死者退出,最終剩下的人勝利。將任

意兩個人之間決斗的輸贏情況告訴你,決斗順序由

你安排,問哪些人可能成為最終的勝利者?

*N<=200

決斗問題

*首先把環(huán)復(fù)制一份接到后面

*然后一個人獲勝就是跟自己相遇

*表示i能j相遇

*Meet[i][j]=meet[i][k]&&meet[k][j]&&(beat[i][k]||

beat[j][k])

*時間復(fù)雜度0(口八3)

BlocksCPOJ139OJ

?現(xiàn)在有一個長度為n的方塊序列,每個方塊有一個顏

色,現(xiàn)在相鄰的相同顏色的方塊可以消除,把長度

為I的方塊消除的得分為求消除所有方塊的最大

得分。

Blocks

*我們可以選擇保留一部分不消除,而跟前面相同顏

色的合并起來一起消除以獲得更大的費(fèi)用,所以再

設(shè)計(jì)狀態(tài)時,我們需要把后面留下的一起考慮進(jìn)去。

*首先我們把相鄰的相同顏色的縮成一段,len[i]表示

第i段的長度

*記pre[i]表示第i段往前第一個與i顏色相同的段的編號

Blocks

*設(shè)小田工燈表示把從第i段到第j段,最后面有長度為k

的與j顏色相同的消去的最大得分

*F[i][j][k]=max[f[i][j-i][o]+(len[j]+k)A2,

*f[>][P^[j]][len[j]+k]+f[pre[j]+i][j][o]]

*記憶化搜索實(shí)現(xiàn)效率高

頭巨形模型

*降維拆成鏈:滑雪

*子矩形:采油區(qū)域

*行列:棋盤分割

*對角線:轉(zhuǎn)紙條

滑雪CSHTSC2002;

*Michael喜歡滑雪這并不奇怪,因?yàn)榛┑拇_很刺激。

可是為了獲得速度,滑的區(qū)域必須向下傾斜,而且

當(dāng)你滑到坡底,你不得不再次走上坡或者等待升降

機(jī)來載你。Michael想知道載一個區(qū)域中最長的滑坡。

區(qū)域由一個二維數(shù)組給出。數(shù)組的每個數(shù)字代表點(diǎn)

的高度。

滑雪

?對于每一個點(diǎn),只能轉(zhuǎn)移到更高的地方:

*f[i]Q]+1T砌叫+1/]>h[i]D]X|i-f|+

lj一j'l=1

*所以海拔高度具有很強(qiáng)的階段性。于是我們考慮把

所有的格子取出來,排個序,這就成了一個線性的

模型。如果用一個堆的話實(shí)現(xiàn)起來更簡單。

*時間復(fù)雜度O(n21ogn2)。

采油區(qū)域CAPIO2OO9J

*Siruseri政府決定將石油資源豐富的Navalur省的土地

拍賣給私人承包商以建立油井。被拍賣的整班土地

為一個矩形區(qū)域,被劃分為MxN個小塊。Siruseri地

質(zhì)調(diào)查局有關(guān)于Navalur土地石油儲量的估測數(shù)據(jù)。

這些數(shù)據(jù)表示為MxN個正整數(shù),即對每一小塊土地

石油儲量的估計(jì)值。為了避免出現(xiàn)壟斷,政府規(guī)定

每一個承包商只能承包一個由KxK塊相連的土地構(gòu)

成的正方形區(qū)域。AoE石油聯(lián)合公司由三個承包商組

成,他們想選擇三塊互不相交的KxK的區(qū)域使得總

的收益最大。

采油區(qū)域

*一共只有六種情況:

采油區(qū)域

案一共只有上面的六種情況,對于這六種情況,我們

分別要雍護(hù):

*以某個點(diǎn)為右上角的矩形內(nèi)的kxk的最大值ru[i][j]

*以某個點(diǎn)為左上角的矩形內(nèi)的kxk的最大值

*以某個點(diǎn)為右下角的矩形內(nèi)的kxk的最大值

*以某個點(diǎn)為左下角的矩形內(nèi)的kxk的最大值

*兩的條豎線之間的kxk的最大值

*兩條橫線之間的kxk的最大值門

采油區(qū)域

*對于前四個值,我們類似的轉(zhuǎn)移,下面以HJ的轉(zhuǎn)移為例:

*ru[i][j]=

max{ru[i-1][j],ni[i][j-1],sum[i-k+l][j—k+l][i]Q]]

*sum[xl][yl][x2][y2]可以通過子矩形和來0(1)維護(hù),這樣

維護(hù)這四個瓦是0(nm)的。

采油區(qū)域

?對于后面兩個,我們需要記錄每行和每列的ru最大

值r[i]和c[i],會個可以在計(jì)算ru的時候同時維護(hù)。

cm新rm而強(qiáng)移,也是類似的,這里以cm為例:

*cm[i][j]=max{cm[i]Q-l],c[j])

*這樣我們通過枚舉分割線,利用上面維護(hù)的值就可

以計(jì)算出答案了。時間復(fù)雜度O(nm)。

棋盤分割(NOI99J

*將一個8*8的棋盤進(jìn)行如下分割:將原棋盤割下一

塊矩形棋盤并使剩下部分也是矩形,再將剩下的部

分繼續(xù)如此分割,這樣割了n-1次后,連同最后剩下

的矩形棋盤共有n塊矩形棋盤。(每次切割都只能沿

著棋盤格子的邊進(jìn)行。)

允許的分割方案不允許的分割方案.

棋盤分割

?原棋盤上每一格有一個分值,一塊矩形棋盤的總分

為其所含各格分值之和。現(xiàn)在需要把棋盤按上述規(guī)

則分割成n塊矩形棋盤,并使各矩形棋盤總分的均方

差最小。均方差。=乒3亙,其中平均值

元=卓巖,修為第i塊矩形棋盤的總分。請編程對給

出的矗及n,求出。的最小值。

棋盤分割

*我們從要計(jì)算的值入手。

*我們可以發(fā)現(xiàn),元的值是一定的。我們把O平方,得

到:a2n=-x)2,我們要使o最小,等價于

使02rl最小。把。2九展開,得到:

*a2n=£仁1(蛭-2xtx+x2)=£21(痣-2%㈤+

x2n

棋盤分割

*于是,我們就要使騫1式靖-2*送)最小。設(shè)

f[i][xl][yl][x2]|y2]裘示把(xl,yl,x2,y2)的矩形分成i份的

(a―24。的最小值,那么:

*f[i][xl][yl][x2][y2]=min{

?f[l][xl][yl][x2]y]+f[i-1][xl]V+I][x2][y2],

*f[i-+f[l][xl][y7+I][x2][y2],

?f[l][xl]|yl][xr][y2]+f[i-l][x7+1][yl][x2][y2],

*f[i-1][xl][yl][xl[y2]+f[l][xf+1][yl][x2][y2]]

?時間復(fù)雜度0(81)。

傳紙條CNOIP2OO8TJ

?給定一個nxm的矩形,每個格子里有一個數(shù)?,F(xiàn)在

求從左上角到右下角的兩條不相交路徑,使經(jīng)過的

格子的和最大。

傳紙條

?因?yàn)槭窃诰匦卫锏膬蓷l路徑,考慮按照步長劃分階

段。

?我們需要記錄兩條路徑的位置,可以發(fā)現(xiàn),因?yàn)椴?/p>

長已經(jīng)定了,所以只要知道橫坐標(biāo),縱坐標(biāo)就可以

推出來。于是,我們設(shè)表示步長為i,第一條

路徑橫坐標(biāo)為j,第二條路徑的橫坐標(biāo)為k的最大和,

因?yàn)閮蓷l路徑可以交換,而這是沒有意義的,所以

我們限定jvk,那么:

傳紙條

*f[Wk]=

max^U-l][j-l][k--l][/][fc],

*f[i-l]U-l][k]J[i-l][j]lk-1])

*上面的方程轉(zhuǎn)移時要注意判斷兩條路徑不能走到一

塊去和不能走到矩陣外面去。

*時間復(fù)雜度0(n3)。

樹形模型

*數(shù)值分配型:選課,貪吃的九頭龍

*多叉轉(zhuǎn)二叉

*樹形背包

*位置轉(zhuǎn)移型:CellPhoneNetwork

*鏈劃分型:樹的最長鏈

*可轉(zhuǎn)化成區(qū)間模型和線性模型:加分二叉樹

選課CCTSC99J

*在大學(xué)里每個學(xué)生,為了達(dá)到一定的學(xué)分,必須從

很多課程里選擇一些課程來學(xué)習(xí),在課程里有些課

程必須在某些課程之前學(xué)習(xí),如高等數(shù)學(xué)總是在其

它課程之前學(xué)習(xí)?,F(xiàn)在有N門功課,每門課有個學(xué)分,

每門課有一門或沒有直接先修課(若課程a是課程b

的先修課即只有學(xué)完了課程a,才能學(xué)習(xí)課程b)o

一個學(xué)生要從這些課程里選擇M門課程學(xué)習(xí),問他

能獲得的最大學(xué)分是多少?

*如果要選課程a必須要選課程b,那么就在a和b之間

連邊,這樣,得到的會是一個森林。于是我們添加

一個節(jié)點(diǎn)o,學(xué)分為o,把這個森林連成樹,于是問

題就是從一顆n+1個節(jié)點(diǎn)的樹里選m+1個節(jié)點(diǎn),使得

總分最大。這樣,點(diǎn)o是必須選的。

*設(shè)£國[j]表示以i為根的子樹中選j個的最大得分,那么:

*f[i][j]=max堡裁葡[子f岡3]}

*這個用樹形背包實(shí)現(xiàn)的話會異常方便。

*考慮邊界。對于一個點(diǎn),f[i][O]=O,f[i][l]=w[i],

其余的都是-Infinity。

*時間復(fù)雜度是0(nm2)的。

貪吃的九頭龍(NOI2OO2)

*傳說中的九頭龍是一種特別貪吃的動物。雖然名字

叫“九頭龍”,但這只是說它出生的時候有九個頭,

而在成長的過程中,它有時會長出很多的新頭,頭

的總數(shù)會遠(yuǎn)大于九,當(dāng)然也會有舊頭因衰老而自己

脫落。

*有一天,有M個腦袋的九頭龍看到一棵長有N個果子

的果樹,喜出望外,恨不得一口把它全部吃掉???/p>

是必須照顧到每個頭,因此它需要把N個果子分成M

組,每組至少看一個果子,讓每個頭吃一組。

貪吃的九頭龍

*這M個腦袋中有一個最大,稱為“大頭”,是眾頭

之首,它要吃掉恰[張個果子,而且K個果子中理所

當(dāng)然地應(yīng)該包括唯一的一個最大的果子。果子由N-1

根樹枝連接起來,由于果樹是一個整體,因此可以

從任意一個果子出發(fā)沿著樹枝“走到”任何一個其

他的果子。

貪吃的九頭龍

*對于每段樹枝,如果它所連接的兩個果子需要由不

同的頭來吃掉,那么兩個頭會共同把樹枝弄斷而把

果子分開;如果這兩個果子是由同一個頭來吃掉,

那么這個頭會懶得把它弄斷而直接把果子連同樹枝

一起吃掉。當(dāng)然,吃樹枝并不是很舒服的,因此每

段樹枝都有一個吃下去的“難受值”,而九頭龍的

難受值就是所有頭吃掉的樹枝的“難受值”之和。

*九頭龍希望它的“難受值”盡量小,你能幫它算算

嗎?

貪吃的九頭龍

*首先,如果k+m-l>m,也就是說果子不夠吃,

顯然無解。

*然后來看答案是如何組成的。

?當(dāng)M=2的時候,難受值的和是大頭吃進(jìn)去的樹枝的

難受值+小頭吃進(jìn)去的難受值

?當(dāng)MN3的時候,我們把果子按照奇偶分層,讓小頭

們輪流吃就可以保證小頭不會吃進(jìn)去樹枝,所以這

個時候難受值的和是大頭吃進(jìn)去的樹枝的難受值。

*我們以大果子為根建樹,同時把邊上的權(quán)值推到下

面的節(jié)點(diǎn)上。

貪吃的九頭龍

豪設(shè)表示以i為根的子樹中,大頭吃MSi被小頭吃的裝小值,

表示以i為根的子樹中,大頭吃Msi被大頭吃的最小值,那么:

*f[i]0][O]=min?潦得兒子min[f[k][pfc][O]+xxw[磯f因[pfc][l]}

*f[iJD][l]=min。%鯊鼠子mto{f[對加+w伙]}

*?(0,?n=2

X=-11^>3

*考慮邊界。如果在一個點(diǎn)大頭不吃,那么顯然是0,所以f[i][0][0]=0;

而如果大頭吃,那么顯然j的值必須是1,所以f[i][l][l]=0。其它的值都

是Infinity。

*時間復(fù)雜度WnnF)。

貪吃的九頭龍

*我們從多叉轉(zhuǎn)二叉的角度來看這道題

樹的最長鏈

*給定一棵樹,求樹的最長鏈

樹的最長鏈

*貪心做法:兩次BFS

*證明

樹的最長鏈

*動態(tài)規(guī)劃:設(shè)f[i]表示兒子連上來的最長鏈,g[i]表示

兒子連上來的次長鏈,h[i]表示父親來的最長鏈

*F[i]=max{f[j]]+1

*同時更新g[i]

*H[i]=max{f[p],h[p]]+I,f[p]>f[i]+1

*=max[g[p],h[p]}+i,f[p]=f[i]+i

CellPhoneNetworkCPOJ3659J

*給定一^果樹,求樹的最小點(diǎn)支配集。

*N<=10000

*支配集:點(diǎn)覆蓋點(diǎn)

CellPhoneNetwork

*每個點(diǎn)有三個狀態(tài):被兒子覆蓋,選自己,不被兒

子覆蓋。

*設(shè)f[譏0]表示被兒子覆蓋需要的最小點(diǎn)數(shù),同口]表

示選自己的最小點(diǎn)數(shù),f[譏2]表示不選自己,不被兒

子覆蓋的最小點(diǎn)數(shù),那么:

CellPhoneNetwork

*f[i][o]=min{嚷j的兒子f耐min{f[k][o],f[i][1])]

*聞M=£j是i的兒子min{f[j][o],f[j][i],f[j][2])

f[i][2]=Ej是j的兒子

*這樣的復(fù)雜度是0(n2)的。

CellPhoneNetwork

*這個方程的瓶頸在第一個轉(zhuǎn)移上,考慮維護(hù)

sum=£min{fO][o],f[j][i]},那么:

?f[i][0]=min{sum-min[f[j][0],f[j][1]}+f[j][1]}

*這樣,整個算法就成0(n)的了。

加分二叉樹CNOIP2OO3J

*設(shè)一個n個節(jié)點(diǎn)的二叉樹tree的中序遍歷為(1,2萬,..?刀),

其中數(shù)字1,2,5…,n為節(jié)點(diǎn)編號。每個節(jié)點(diǎn)都有一個分?jǐn)?shù)

(均為正整數(shù)),記第j個節(jié)點(diǎn)的分?jǐn)?shù)為di,tree及它的每

個子樹都有一個務(wù)口分,任一棵子樹subtree(也包含tree

本身)的加分計(jì)算方法如下:

*subtree的左子樹的加分Xsubtree的右子樹的加分十

subtree的根的分?jǐn)?shù)

*若某個子樹為主,規(guī)定其加分為1,葉子的加分就是葉

節(jié)點(diǎn)本身的分?jǐn)?shù)。不考慮它的空

*子樹。

*試求一棵符合中序遍歷為(i,2,3,..?,n)且加分最高的二

叉樹tree。要求輸出;

*(1)tree的最高加分

*(2)tree的前序遍歷

加分二叉樹

?本題乍一看像是一個樹形模型,但是樹的形態(tài)又不

確定,不能用樹形模型的方法來做。

*設(shè)幣][j]表示從i到j(luò)的一段是一棵子樹的最大加分,那

么:

?f[i][j]=max{f[i][k-l]*f[k+l][j]+s[k]]

*時間復(fù)雜度0(n3)

*第二問:記錄第一問的決策

背包模型

*部分背包

*01背包

*完全背包

*多重背包

*分組背包

*依賴背包

*泛化物品

背包問題

*給定一個容量為m的背包和n個物品,每個物品有一

個價值v和一個費(fèi)用w,求在滿足容量限制的情況下

最大化價值。

*NPC問題

部分背包問題

*特點(diǎn):物品可以任意劃分

*方法:求單位價值,貪心

01背包問題

?特點(diǎn):每種物品只有一個,要么取,要么不取

*設(shè)用田]表示前i個物品,容量為j的最大價值,很顯然,

每個物品有取或不取兩種決策:

*f[i][j]=max{f[i-l][j],f[i-l][j-cost[i]]+

value[i]]

*這個方法時間復(fù)雜度是O(rnn)的,空間復(fù)雜度是

O(rnn)的。

01背包問題

*空間優(yōu)化:滾動數(shù)組

*代碼:

*voidZeroOnePack{

*for(inti=i;i〈=n;i++)

*for(intj=m;j>=cost[i];j-)

*gmax(f[j],f[j-cost[i]]+value[i]);

*)

完全背包問題

*特點(diǎn):每種物品有無窮多個

*f[i][j]=max{f[i-l]|j],f[i-l][j-cost[i]]+

value[i],f[i][j—cost[i]]+value[i]}

*代碼:

*voidCompletePack{

*for(inti=i;i<=n;i++)

*for(intj=cost[i];j<=m;j++)

?gmax(f[j],f[j-cost[i]]+value[i]);

*}

多重背包問題

*特點(diǎn):每類問題有個數(shù)限制c[i]

*基本想法:每類物品的每一個看作一個物品,轉(zhuǎn)化成01

背包

*代碼:

*voidLimitedPack{

*for(inti=i;i〈=n;i++)

*for(intj=i;j<=limit[i];j++)

*for(intk=m;k>=cost[i];k-)

*gmax(f[k],f[k-cost[i]]+value[i]);

*}

多重背包問題

*優(yōu)化:

*二進(jìn)制拆分

*原理:2八k能夠表示出0~2A(k+1>1的所有數(shù)

*把c[i]拆成若干2八k相力口

*O(nmlogc)

分組背包問題

*特點(diǎn):物品被分為很多組,每組之間有限制。

*假設(shè)限制為:每組只能取一個

*F[i][j]=max[f[i-i][j],f[i-i][j-w[i][k]]+v[i][k]]

*代碼:

*voidGroupPack{

*for(inti=i;i〈=n;i++)

*for(intj=m;j>=mincost[i];j-)

*for(intk=i;k<=cnt[i];k++)if(cost[i][k]<=j)

*gmax(f[j],f[j-cost[i][k]]+value[i][k];

*}

分配時間CWFTSC2009TJ

*考試的時候合理分配時間是很重要的,我們應(yīng)該在

同樣的時間內(nèi)盡量得到更多的分?jǐn)?shù)?,F(xiàn)在有m道題

需要在n分鐘內(nèi)解決,每道題分為p個步驟,每道題

的每個步驟都會有不同的分值,所需時間也不盡相

同?,F(xiàn)在你可以從任意一道題的任意一個步驟開始,

如果當(dāng)前步驟與上一步驟不連續(xù),則需要q分鐘的思

考時間(每題第一個步驟之前同樣需要思考),請

確定自己的策略使得獲得的分?jǐn)?shù)最高。

分配時間

*每道題實(shí)際上是一個組。

*我們可以發(fā)現(xiàn),每個步驟選或不選對后面的決策是有影

響的,所以我們考慮加一維來區(qū)分。

*設(shè)耳口用小]表示前i道題的前j個步驟,其中第i道題的第j

個步驟被選,在k分鐘內(nèi)解決的最大得分,g[i][j][k]表

示前i道題的前j個步驟,其中第i道題的第j個步驟不被選,

在k分鐘內(nèi)解決的最大得分,那么:

分配時間

*f[i][l]M=max{f[i-l][p][k-q-t[i][l]],g[i-l][p][k-

q-t[i][l]}+s[i][l]

?g[i][l][k]=max[f[i-1][p][k],g[i-1][p][k]}

?f[i]D][k]=

max[f[i][j-l][k-t[i][j]],5[i][/-l][k-q-t[i][/]]}+

s[i][f]

?9[口皿k]=max{f[i][j-l][klg[i][j-l][k]}

?時間復(fù)雜度O(nmp)。

依賴背包問題

*依賴背包問題,顧名思義,就是一些物品可以選要

建立在其它一些物品被選的基礎(chǔ)之上。這類問題往

往是建立在樹上的,所以通常也叫樹形背包問題。

鑒于在樹形模型中已經(jīng)有了比較詳細(xì)的討論,這里

不再詳細(xì)展開

泛化物品

?背包問題的終極版

*泛化物品是指沒有固定的費(fèi)用和價值,其價值是關(guān)

于費(fèi)用的函數(shù)。即:在容量為V的背包問題中,泛化

物品是定義域?yàn)?.,.V的函數(shù)h,當(dāng)其費(fèi)用為V時,其

價值為h(v)。

泛化物品

*voidGeneralMatters{

*for(inti=i;i<=n;i++)

*for(intj=m;j>=o;j-)

*for(intk=o;k<=j;k++)

*gmax(f[j],f[j-k]+cost(i,k));

*)

泛化物品

*回顧上面的數(shù)值分配型的樹形動態(tài)規(guī)劃,考慮其中

的一個節(jié)點(diǎn)i,其子樹就相當(dāng)于一個一個的泛化物品,

隨著分配給它們的數(shù)值的變化,其價值也在不斷的

變化。由此可見,泛化物品在各個方面都有著很廣

泛的應(yīng)用。

圖狀模型

*環(huán)狀:

*Naptime

*拓?fù)鋱D:

*關(guān)鍵路徑

*一般圖模型

最優(yōu)貿(mào)易

環(huán)狀模型

*找一個位置把環(huán)拆成鏈

*DP

*把鏈的首尾接成環(huán)

*枚舉首狀態(tài)

Naptime「POJ2228)

*小尸同學(xué)最近特別累,老是想睡覺

*小F同學(xué)把一天分為n個時段,選擇不一定連續(xù)的m

個時段來睡覺

*小F同學(xué)睡眠質(zhì)量不好,每次睡覺要花1個時段來進(jìn)

入睡眠

*每個時段有一個休息值a[i],如果小F同學(xué)選擇在[l,j]

的時段內(nèi)睡覺的話,得到的休息就是a[i+i]+...+a[j],

因?yàn)闀r段i被用來進(jìn)入睡眠了

*如何選擇能夠休息的最好?

*注意天與天是連續(xù)的,即這n個時段是一個環(huán)

naptime

*因?yàn)榄h(huán)首尾相接的地方會對結(jié)果產(chǎn)生影響,所以要枚舉

開始的狀態(tài),做幾遍DP

*設(shè)表示前i個時間段睡了j段,第i段不睡的最長時

間,的仃如裝示第i段睡島最長舟面,那么:

*f[i][j][o]=max{f[i-i][j][o],f[M][j][i])

*f[d[i][1]=max{f[i-i][M][o],f[i-i][j-i][i]+t[i]}

*初始時,所有的f二-INF

*然后枚舉第一個時間段睡不睡,分別使

f[l][l][l]=1,f[l][o][o]=l,做兩次DP

*內(nèi)存限制比較緊,要滾動

拓?fù)鋱D模型

*邊拓?fù)渑判蜻匘P

*SCC縮點(diǎn)

關(guān)鍵路徑

*給定一個DAG,求從s到t的最長路

關(guān)鍵路徑

*設(shè)f[i]表示從s到i的最長路徑

*F[i]+dis[i][j]->f[j]

*拓?fù)渑判虻倪^程中解決

最優(yōu)貿(mào)易CNOIP2OO9TJ

*給定一個圖,邊有的是單向的,有的是雙向的

*有一個水晶球,每個點(diǎn)有一個價格

*從5出發(fā)到t,沿途在某個點(diǎn)買入水晶球,在另一個點(diǎn)

賣出

*顯然你要先買入才能賣出

*最大化收益

最優(yōu)貿(mào)易

*方法一:

*同一個SCC里的點(diǎn)都可以走到,可以在其中任意一個

買,任意一個賣

*收縮SCC,記錄SCC的最大值和最小值

*F[i]表示到i的最大獲利,g[i]表示到i的最小價格,

minv[i]表示i所在SCC的最小價格,maxv[i]表示i所在

SCC的最大價格

*G[i]=min[g[j],minv[i]}

*F[i]=max{f[j],maxv[i]-g[i]]

*邊拓?fù)渑判蜻呑?/p>

最優(yōu)貿(mào)易

*方法二:

*F[i][o]表示到i點(diǎn),沒有水晶球的最大

*表示到i點(diǎn),有水晶球的最大

*F[i][o]=max{f[j][o],f[j][i]+w[i]]

*f[i][i]=max{f[j]

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論