演算法筆記11 8 DP總結

2021-09-14 04:09:37 字數 1212 閱讀 8278

經典dp模型總結:

(1)最大連續子串行和

令dp[i]表示以a[i]作為末尾的連續序列的最大和

(2)最長不降子串行

令dp[i]表示以a[i]結尾的最長不下降子串行長度

(3)最長公共子串行(lcs)

令dp[i][j]表示字串a的i號位和字串b的j號位之前的lcs長度

(4)最長回文子串

令dp[i][j]表示s[i]至s[j]所表示的子串是否是回文子串

(5)數塔dp

令dp[i][j]表示從第i行第j個數字出發的到達最底層的所有路徑上所能得到的最大和

(6)dag最長路

令dp[i]表示從i號頂點出發能獲得的最長路徑長度

(7)01揹包

令dp[i][v]表示前i件物品恰好裝入容量為v的揹包中能獲得的最大價值

(8)完全揹包

令dp[i][v]表示前i件物品恰好裝入容量為v的揹包中能獲得的最大價值

注:一般來說,"子串行"可以不連續,"子串"必須連續

啟發:

當題目與序列或字串(記為a)有關時,可以考慮把狀態設計成下面兩種形式,然後根據端點特點去考慮狀態轉移方程

1.令dp[i]表示以a[i]為結尾(或者開頭)的***

2.令dp[i]表示以a[i]至a[j]區間的***

其中***均為原問題的表述

當題目中的狀態需要幾維來表示,然後對其中的每一維採取下面的某乙個表述:

1.恰好為i

2.前i

在每一維的含義設定完畢後,dp陣列的含義就可以設定成"令dp陣列表示恰好為i(或前i)、恰好為j(或前j).....的***"

其中***為原問題的表述。接下來就可以通過端點的特點去考慮狀態轉移方程。

說明:

在大多數情況下,都可以把dp可解的問題看做乙個有向無環圖(dag),圖中的結點就是狀態,邊就是狀態轉移的方向,

求解問題的順序就是按照dag的拓撲進行求解。從這個角度可以輔助理解動態規劃。

相關習題

演算法筆記Codeup練習C語言11 8

題目描述 有10個學生,每個學生的資料報括學號 姓名 3門課程的成績。讀入這10個學生的資料,要求輸出3門課程的總平均成績,以及個人平均分最高的學生的資料 包括學號 姓名 3門課程成績 平均分數 輸入共有10行,每行包含了乙個學生的學號 整數 名字 長度不超過19的無空格字串 和3門課程的成績 0至...

演算法筆記 區間dp

1.石子歸併問題 dp i j 表示區間i到j合併所需的最小花費。先求出小區間的最小花費,再轉移到大的區間。轉移方程 dp i j min dp i j dp i k dp k 1 j 初始狀態 dp i i 0 模板 for int i 1 i n i cin a i sum i sum i 1 ...

PAT B1020 演算法筆記順序P118

1020 月餅 25 分 月餅是中國人在中秋佳節時吃的一種傳統食品,不同地區有許多不同風味的月餅。現給定所有種類月餅的庫存量 總售價 以及市場的最大需求量,請你計算可以獲得的最大收益是多少。注意 銷售時允許取出一部分庫存。樣例給出的情形是這樣的 假如我們有 3 種月餅,其庫存量分別為 18 15 1...