線性動態規劃

2021-09-08 10:27:16 字數 1826 閱讀 4071

準確來說,動態規劃是一種思想,而不是一種演算法。算導裡將它歸結為——高階程式設計技巧。

線性dp最常見的有: 子集和問題,lis問題,lcs問題。

拓展之後有:子段和問題,雜類問題。

子集和問題的乙個例項: 〈s,t〉。其中,s=是乙個正整數的集合,c是乙個正整數。子集和問題判定是否存在s的乙個子集s1,使得s1中的各元素之和等於c。 這其實就是0/1揹包。

硬幣計數問題的乙個例項:給出n個正整數組成的集合,ka1+ka2+ka3+...kan=t有多少解? 這其實就是0/1揹包計數。

揹包問題的早期總結來自於dd_engi的揹包九講。其中屬於線性dp的部分為:0/1揹包,完全揹包,多重揹包,混合揹包,分組揹包,二維費用揹包。

計數問題的迴圈和轉移方程和揹包問題都非常相似。

@練習題。

hdu 1864,浮點數0/1揹包。先對**做個轉化,不然沒法陣列轉移。

zoj3211,貪心0/1揹包,首先可以肯定的是,要滿足最大,每天肯定都得取。由於每棵樹增長快慢不同,所以肯定先砍增長慢的,後砍增長快的,權值(j-1)*b+a。

hdu 1114,最小化完全揹包,初始化全部為inf,轉移條件從max改為min。特判條件兩個:f[v]>=inf代表不可能裝滿,v=0代表空揹包。

這題同時也牽扯到最大化揹包的初始化問題,如果要求裝滿揹包, 則f[0]=0,f[1..v]=-inf。

hdu 1712,分組揹包。n天,m節課。對於每一天,可以選擇1...m之間任何一節課。注意for(v)迴圈在for(組)迴圈外面,才能保證每組只有乙個被選。

poj 1276,多重揹包。

hdu 1171,多重揹包。盡可能將總價值半分,先用v/2揹包一次,這個結果是最接近v/2的,然後另乙個就是v-f[v/2]了。

hdu 2844,多重揹包可達。需要求的是可以湊出多少種面值。由於錢幣的特殊性(val=cost),所以揹包完了之後,判斷f[i]=i的個數即可。

poj 1014,多重揹包可達。判斷一堆石子能否分為價值相等的兩堆。特性val=cost,判斷f[v/2]是否等於v/2即可。另外v是奇數可以不用計算。

uva 147,完全揹包計數。迴圈倒過來,根據基礎面值壓縮一下全部面值。

hdu 5000, 分組揹包計數。2014鞍山網路賽d題,乙個神奇的結論,把所有t值加起來/2就是揹包容量,然後每組物品就是0~t[i],注意0值物品不要選,是沒意 義的,實際上是從1~t[i]。wjmzbmr說其實用分組揹包是tle的,這題比賽時候就放水了,t^t。至於結論證明,orz不會。

lis 的轉移方程f[i]=max(a[i],f[j]+a[i]),其中j的範圍是1...i-1,常規是掃一遍o(n),借助二分查詢可以o(logn), 也就是所謂的二分優化。lis分為單維度,和雙維度兩類。單維度直接dp,雙維度需要先sort,讓其中乙個維單調,然後對另乙個維dp。

@練習題

poj 2533,裸題,可以練習二分優化的使用。

poj 1609,雙維度lis。鋪磚頭,新的磚放舊的磚上面,必須滿足l>=l',m>=m',先對l排序,然後對m dp。注意本題的第一維可以相等。如果要求不等,則dp條件裡還要對l維特判,如vijos 1336。

poj 3616,雙維度lis。擠牛奶,多個時間段,要求不能重疊,且擠完後休息r時間。先對開始時間排序,然後對結束時間dp。條件由原來的遞增改為j.end+r<=i.start。

vijos 1303,單維度lis。飛彈攔截,第一問是lds,第二問是lis。第二問是lis的原因是,只要單調增就得+1,所以lis是正確的。lis+lds=n,倆個正好互補。

vijos 1336,雙維度lis。看起來像個迷宮dp,其實不是。想要距離最短,就得盡可能走特殊邊。但是特殊邊是有要求的,後乙個特殊邊x>x',y>y',dp即可。

線性動態規劃

方格取數 題目 提交記錄 討論題解設有 n n 的方格圖,我們在其中的某些方格中填入正整數,而其它的方格中則放入數字0。如下圖所示 2.gif 某人從圖中的左上角 a 出發,可以向下行走,也可以向右行走,直到到達右下角的 b 點。在走過的路上,他可以取走方格中的數 取走後的方格中將變為數字0 此人從...

動態規劃 線性DP

線性dp 即線性動態規劃,不侷限於 線性時間複雜度 的一維動態規劃。與數學中的 線性空間 類似,如果乙個動態規劃演算法的 狀態 包含多個維度,但在每個維度上都具有 線性 變化的 階段 那麼該動態規劃演算法同樣稱為 線性dp 在這類問題中,需要計算的物件表現出明顯的維度以及有序性,每個狀態的求解直接構...

動態規劃線性Dp LCS LIS

longest common subsequence 原題鏈結 給定兩個長度分別為n和m的字串a和b,求既是a的子串行又是b的子串行的字串長度最長是多少。輸入格式 第一行包含兩個整數n和m。第二行包含乙個長度為n的字串,表示字串a。第三行包含乙個長度為m的字串,表示字串b。字串均由小寫字母構成。輸出...