閆氏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 分析法完成簡單計算器的設計,其中算術表示式的文法如下 無符號整數 數字 標誌符 字母 表示式 項 項 因子 因子...