版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年個人舊房屋翻新改造工程承包合同3篇
- 2025年度個人理財(cái)產(chǎn)品分紅協(xié)議
- 二零二四全新打印機(jī)租賃合作協(xié)議書范本3篇
- 2025年度鋰電池電芯代工合作協(xié)議書4篇
- 二零二五年度美容院品牌形象設(shè)計(jì)及使用權(quán)授權(quán)合同
- 二零二五年度特殊面料窗簾定制合同3篇
- 2025年度實(shí)習(xí)生勞動合同終止及培訓(xùn)費(fèi)用退還協(xié)議4篇
- 二零二五年度木板電商平臺入駐及銷售合同4篇
- 2024項(xiàng)目部治理人員安全培訓(xùn)考試題(各地真題)
- 2023年-2024年崗位安全教育培訓(xùn)試題(答案)
- 國際貿(mào)易地理 全套課件
- GB/T 20878-2024不銹鋼牌號及化學(xué)成分
- 診所負(fù)責(zé)人免責(zé)合同范本
- 2024患者十大安全目標(biāo)
- 印度與阿拉伯的數(shù)學(xué)
- 會陰切開傷口裂開的護(hù)理查房
- 實(shí)驗(yàn)報告·測定雞蛋殼中碳酸鈣的質(zhì)量分?jǐn)?shù)
- 部編版小學(xué)語文五年級下冊集體備課教材分析主講
- 電氣設(shè)備建筑安裝施工圖集
- 《工程結(jié)構(gòu)抗震設(shè)計(jì)》課件 第10章-地下建筑抗震設(shè)計(jì)
- 公司法務(wù)部工作細(xì)則(草案)
評論
0/150
提交評論