DP基礎題型總結 01揹包和LIS以及LCS

2021-09-25 14:02:09 字數 2212 閱讀 3725

今天做了學長拉的lis和lcs以及揹包問題的專題,因此就在這做個總結。

首先講一下關於揹包問題,

揹包中最關鍵的無非就是01揹包,以及完全揹包,而且這兩個**也都很好寫,也很好理解(就迴圈遍歷的順序變了),除此之外還有多重揹包,二維費用的揹包,以及混合揹包,但萬變不離其宗,都是由01揹包演變而來,而且大都可以變成01揹包的形式。

下面貼一些01揹包以及多重揹包的題型。

基礎揹包問題

hdu2602——01揹包模板

題解hdu2191——多重揹包模板

題解hdu2546——01揹包理解

題解robberies ——01揹包變形(思維題)

題解hdu2639——01揹包+第k優解問題

題解hdu1171-——多重揹包理解

題解都是一些水題,不過可以加深一下自己看完揹包九講後的印象。

講完揹包問題就是lcs和lis(兩種實現)

先將lcs吧

lcs(longest common sequence) ,最長公共子串行,是乙個比較經典的dp基礎問題,也是很重要的,很多比賽都有從它變形出來的題,其中主要的題型就是記錄和輸出路徑。

先上裸的**

//遞迴寫法,時間複雜度很不友好!!慎用。

//而且我們有爸爸媽媽都喜歡的遞推寫法,所以。。。

#include #include using namespace std;

char str1[205],str2[205];

int len1,len2;

int maxlen(int i, int j)

int main(int argc, char** ar**)

} cout << maxlen[len1][len2]《其實這個是比較好理解的,狀態轉移方程式

if(str1[i]==str2[j])

dp[i][j]=dp[i-1][j-1]+1

else 

dp[i][j]=max(dp[i][j-1],dp[i-1][j])

dp[i][j]表示在str1的前i個字母和str2的前j個字母裡面有多少個相同的。

然後就是lis,最長上公升子串行(類似有下降,嚴格上公升之類的)

首先丟擲o(n*n)的寫法

#include using namespace std;

const int maxn = 100000 + 10;

int a[maxn];

int dp[maxn];

int main(int argc, char** ar**)

for(int i = 1; i < n; i++)

for(int j = 0; j < i; j++)

if(a[j] < a[i] )

dp[i]=max(dp[j]+1,dp[i]);

int maxlen=0;

for(int i = 0; i < n; i++)

if(maxlen再來乙個o(n*logn)的寫法,其實就是二分一下

#include#includeusing namespace std;

const int maxn = 50001;

int binary_search(int key, int *g, int low, int high)

return low;

}int main()

cout << len << endl;

}return 0;

}

也可以借用stl中的lower_bound,

int n;

cin>>n;

int dp[1005],a[1005];

for(int i = 1;i<=n;++i)

int k = 1;

dp[k]=a[1];

for(int i = 2;i<=n;++i){

if(dp[k]狀態轉移方程的話,dp[i]=max(dp[j]+1,dp[i])(a[j]dp[i]表示在前i個數裡面有多少個上公升的數。

lis和lcs習題

最長公共子串行(lcs)模板題

上面有。

poj2533——o(nlogn)lis演算法

上面有。

poj1836——正逆兩次lis求最大值

題解hdu1160——二維lis+輸出路徑

題解poj2250——lcs記錄路徑

題解hdu1503——lcs路徑輸出

題解

DP基礎 01揹包 複習

時間限制 1 sec 記憶體限制 128 mb 乙個旅行者有乙個最多能用m公斤的揹包,現在有n件物品,它們的重量分別是w1,w2,wn,它們的價值分別為 c1,c2,cn。若每種物品只有一件,求旅行者能獲得最大總價值。第一行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 第2.n 1...

揹包dp之01揹包

現在我們有n個配件,他們有不同的價值.但是我們揹包的容量是有限的,因為我們只有乙個一級包,所以我們最多可以裝v重量的東西.但是為了能更好的吃到雞 不存在的 我們要攜帶更有價值的配件,請問我們最多能拿多少價值的配件來當快遞員呢?輸入的第一行是t,表示有一共要打t場比賽.每組資料由三行組成.第一行包含兩...

揹包dp之01揹包變形

一種雙核cpu的兩個核能夠同時的處理任務,現在有n個已知資料量的任務需要交給cpu處理,假設已知cpu的每個核1秒可以處理1kb,每個核同時只能處理一項任務。n個任務可以按照任意順序放入cpu進行處理,現在需要設計乙個方案讓cpu處理完這批任務所需的時間最少,求這個最小的時間。輸入描述 輸入包括兩行...