1. 程式人生 > 其它 >Dp 專題

Dp 專題

Konata28

三層:階段,狀態,決策

Hu Kang

以下均以 01 揹包舉例。

狀態表示

將每一個狀態看作一個集合集的屬性

\(f[i,j]\) 表示前 \(i\) 個物品中總體積為 \(j\) 的物品集合集的元素大小和的最大值(屬性)。

\(e.g.\)

\[id:1,2,3 \]\[w_i:4,5,9 \]\[v_i:6,8,7 \]\[f[3,9]\to\{\{1,2\},\{3\}\} \]

其中 \(\{1,2\}\) 的價值和最大,為 \(6+8=14\),故 \(f[3,9]=14\)

常見的屬性有:大小、最值、和、乘積、異或和……

狀態轉移

對集合集中集合的劃分。

\(f[i,j]\)

的集合集劃分成包含 \(i\) 物品的集合和不包含 \(i\) 物品的集合。

兩種情況分別對應 \(f[i-1,j]\)\(f[i-1,j-w_i]+v_i\)

所以狀態轉移方程為 \(f[i,j]=\max(f[i-1,j],f[i-1,j-w_i]+v_i)\)

\(e.g.\)

\[id:1,2,3,4 \]\[w_i:4,5,9,8 \]\[v_i:6,8,7,1 \]\[f[4,13]\to\{\color{blue}{\{1,3\}},\color{red}{\{2,4\}}\} \]

藍色為不含 \(i\) 的,紅色為含 \(i\) 的。

再思考,可以用滾動陣列優化空間複雜度。

Unknown

拿到一道題,先寫出狀態轉移方程,再優化時間複雜度

狀態優化:

對於狀態可累加
\(e.g.dp[i+j]=dp[i]+dp[j]+i+j\)
的,用倍增優化

決策優化:

\(e.g.dp[i][j]=\max(dp[i-1][j-233]+(j-233)^2,dp[i-1][j-232]+(j-232)^2,...,dp[i-1][j]+j^2)\)
單調佇列優化

\(e.g.dp[i]=\max(dp[1]+i,dp[2]+2i,...,dp[i-1]+(i-1)i)\)
斜率優化

交叉小於包含
\(e.g.dp[i][j]=\max(dp[i][i]+dp[i+1][j],dp[i][i+1]+dp[i+2][j],...,dp[i][j-1]+dp[j-1][j],dp[i][j]+dp[j][j])\)


用四邊形不等式優化

本文作者為小蒟蒻:ShaoJia

轉載請註明原文連結。

碼字不易,求關照,謝謝!