閆氏DP分析法

2021-10-04 11:05:21 字數 3192 閱讀 3106

閆氏dp分析法

核心:從集合角度分析dp問題

1.狀態表示 f(i)

2.狀態計算,化整為零的過程

例題1,01揹包問題

有n件物品和乙個容量式v的揹包,每件物品只能使用一次

第i件物品的體積式vi,價值是wi

求將這些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大

dp狀態表示:f(i,j)

集合:只考慮前i個物品,且總體積不超過j的選擇方案集合

屬性:max f(n,v)

狀態計算:

集合1,不選第i個物品的方案,f(i-1,j)

集合2,選第i個物品的方案,f(i-1,j-vi)+wi

將集合1和集合2取最大值就是所求答案 max(f(i-1,j),f(i-1,j-vi)+wi)

/*01揹包問題的樸素寫法,二維陣列*/

#include

using

namespace std;

const

int n=

1010

;int n,m;

int v[n]

,w[n]

;int f[n]

[n];

intmain()

} cout<[m]

}

/*01揹包問題優化,一維陣列*/

#include

using

namespace std;

const

int n=

1010

;int n,m;

int v[n]

,w[n]

;int f[n]

;int

main()

} cout<

}

例題2.完全揹包問題

01揹包中每個物品只能用1次,完全揹包的每個物品可以用無限次

把01揹包問題從大到小遍歷改為從小到大遍歷就是完全揹包dp

狀態表示:

集合:所有只從前i個物品中選,總體積不超過j的方案集合

屬性:max

狀態計算:

集合0:選0個第i個物品,f(i-1,j)

集合1:選1個第i個物品,f(i-1,j-vi)+wi

集合k:選k個第i個物品,f(i-1,j-kvi)+kwi

f(i,j) = max(f(i-1,j),f(i-1,j-vi)+wi,…,f(i-1,j-kvi)+kwi)

f(i,j-vi) = max(f(i-1,j-vi),f(i-1,j-2vi)+wi,…,f(i-1,j-kvi)+kwi)

立即推:f(i,j) = max(f(i-1,j),f(i,j-vi)+wi)

/*

01揹包:f[i][j] = max(f[i-1][j],f[i-1,j-v]+w)

完全揹包:f[i][j] = max(f[i-1][j],f[i][j-v]+w)

*/#include

using

namespace std;

const

int n=

1010

;int n,m;

int v[n]

,w[n]

;int f[n]

[n];

intmain()

} cout<[m]

}

/*

完全揹包問題優化

*/#include

using

namespace std;

const

int n=

1010

;int n,m;

int v[n]

,w[n]

;int f[n]

;int

main()

} cout<

}

例題三,合併石子問題

每次只能合併相鄰的兩堆,合併的代價為這兩堆石子的質量和,合併後與這兩堆石子相鄰的石子和新堆相鄰,合併時由於選擇的順序不同,合併的代價也不同

比如有4堆 1 3 5 2 ,我們可以先合併1、2堆,代價為4,得到452,又合併1,2堆代價為9,得到9,2,再合併得到11,總代價為4+9+11

找出一種合適的方法,使總合併代價最小

dp狀態表示:

集合:所有將[i,j]合併成一堆的方案

屬性:min

**狀態計算:**f[i,j] = f[i,k]+f[k+1,j]+s[j]-s[i-1];

#include

using

namespace std;

const

int n=

310;

int n;

int s[n]

;//前n項和

int f[n]

[n];

intmain()

} cout<[n]

}

例題四:最長公共子串行

給定兩個長度分別為n和m的字串a,b,求即是a的子串行又是b的子串行的字串長度是多少。

dp狀態表示:

集合:所有a[1,i]與b[1,j]的公共子串行的集合

屬性:max

**狀態計算:**f[i,j] = max(f[i-1,j],f[i,j-1],f[i-1,j-1]+1)

#include

using

namespace std;

const

int n=

1010

;int n,m;

char a[n]

,b[n]

;int f[n]

[n];

intmain()

} cout<[m]

}

閆式DP分析法

學好dp的乙個關鍵點在於刷遍所有型別的dp題目 閆式dp分析法的核心思想是從集合的角度來分析dp問題。所有的dp問題都可以使用閆式dp分析法進行分析。經過70道題目驗證通過?我們可以把做過的所有dp問題都看作是有限集上的最值問題。dp問題 有限集上的最值問題 然而,由於這個有限集的數量級很高 通常是...

杜邦分析法 漏斗分析法和矩陣關聯分析法

資料分析工作涉及到很多的分析方法,比如說杜邦分析法 漏斗分析法以及矩陣關聯分析法,這些方法都是能夠幫助我們更好地進行資料分析工作。在這篇文章中我們就給大家介紹一下關於杜邦分析法 漏斗分析法和矩陣關聯分析法的相關知識,希望能夠更好地幫助大家增長見識。1.杜邦分析法 資料分析中的杜邦分析法是由美國杜邦公...

基於LR分析法的簡單分析法

一 課程設計目的 通過設計 編制 除錯乙個簡單計算器程式,加深對語法及語義分析原理的理解,並實現詞法分析程式對單詞序列的詞法檢查和分析。二 課程設計內容及步驟 本次課程設計需要使用 lr 分析法完成簡單計算器的設計,其中算術表示式的文法如下 無符號整數 數字 標誌符 字母 表示式 項 項 因子 因子...