帝都Day3 各種dp

2022-05-27 16:57:10 字數 3104 閱讀 8961

備註:day1 day2記得筆記太233,所以就不發了

備註2:day4~day7發不發看心情qaq

(7.17持續更新中...)

動態規劃a 記憶化搜尋 & 動態規劃初步

8點15: 楊姓dalao嘮叨了幾句;8點20:上課正式開始

part1 記憶化搜尋

數字金字塔:luogu 1216

一、搜尋(dfs)

沒乙個點向左或向右走

void dfs(int x,int y,int val)

dfs(x+1,y,val);

dfs(x+1,y+1,val);

}

二、記憶化搜尋:

冗餘搜尋:無用的,不會改變答案的搜尋。

那麼,怎麼優化程式?對於每乙個位置都記錄乙個值,代表搜到此位置時,最大路徑和時多少

void dfs(int x, int y, int val)

dfs(x+1, y, val);

dfs(x+1, y+1, val);

}

揹包問題:luogu 1048

一、搜尋:

狀態(x,w,v)——搜到第x件物品,物品總質量w,總**v

行動——我要不要

約束——物品總質量不超過最大值

目標——物品總價值最大

冗餘:(x1,w1,v1)和(x2,w2,v2)時,x1=x2,w1=w2,v1二、記憶化搜尋

void dfs(int t,int x,int val)

dfs(t,x+1,val);

if(t>=w[x])dfs(t-w[x],x+1,val+v[x]);

}

其實,就是對於冗餘的情況不再搜尋......(這讓我想起了滑雪)

part2.動態規劃

在最優路徑上走,每走一步都是最大值。

最優性:設走到某乙個位置的時候,它達到了路徑的最大值,

dp:只記錄狀態的最優值,並用最優值來推導其他的最優值。

記錄f[i][j]路徑最大值,有兩種方法推導:

順推;逆推。

數字金字塔:luogu 1216

順推:f[i][j]->f[i+1][j]、f[i+1][j+1];

逆推:f[i-1][j];f[i-1][j-1]->f[i][j];

//順推

f[0][0]=a[0][0];

for(int i=0;i狀態轉移方程

順推:逆推:

逆推改變搜尋順序

for(int i=0;i=0;--i)

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

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

ans=f[0][0];

這種做法不需要判斷邊界了

順推、逆推依個人喜好而定(反正我喜歡逆推??????)

轉移順序:最優值之間的推導順序

能使用dp做的題:有明確的推導順序。數字金字塔裡就有——自上而下。

能分成不同的階段,階段逐步進行。和搜尋順序是類似的

劃分好階段,前往後、後往前推都ok

用一維陣列寫揹包問題

揹包 記錄f[i][j]:決定前i件物品,在總重量j情況下,物品總價值最大值

狀態轉移方程:狀態之間的推導公式

逆推:從什麼狀態可以到達我這裡?

揹包 順推

for(int i=0;i揹包 逆推

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

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

ans=0;

for(int i=0;i<=t;++i)ans=max(ans,f[n][i]);

陣列壓縮:

用乙個一維陣列代替二維陣列

f[i]只由f[i-1]決定,其它的就沒用了(優化空間複雜度)

只能倒著列舉了

**實現

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

for(int j=t;j>=0;--j)

不建議寫一維陣列,因為有害,空間不夠寫滾動陣列

9點25 課間休息......

9點40 繼續上課......

完全揹包

完全揹包的陣列壓縮比較簡單了for(i=1 to n) for(j=0 to m) if(j>=w[i])f[j]=min(f[j],f[j-w[i]]+p[i];

順著列舉是完全揹包,逆著01

多重揹包不要用一維!能用二維幹嘛要用一維。。。

揹包計數問題:luogu1466 集合

把數字i看成質量i的物品,求出裝滿重m揹包的方案數(然後除以2)

順推f[1][0]=1;

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

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

f[i+1][j]+=f[i][j];

if(i+1逆推

f[0][0]=1;

for(i=1 to n)

for(j=0 to m)

f[i][j]=f[i-1][j]; 

if(j>=i)f[i][j]+=f[i-1][j-1];

陣列壓縮

g[0]=1;

for(i=1 to n)

for(j=m to i)

g[j] += g[j-i];

luogu 貨幣系統

10點20下課

10點30上課

多重揹包:物品有數量限制

01:只有一件

完全:無數量限制

完全揹包

多件物品:拆解成1件物品組成的物品+兩件+四件......,單獨**,變成01揹包

為什麼怎麼做呢?因為二進位制的神奇功效

【下午做題】

一、洛谷p1004 方格取數

二、飛彈攔截

三、合唱隊形

四、lcs(lcs轉為lis,用nlog2n解決)

五、lcs洛谷有關例題

待更

日積月累 day3

sector 扇區,段 分段 vertically 豎直地,直立地 horizonally 水平地backspace 退格,回退 terminate 端接,終止 drag 拖,拉,牽,拽 formatted 有格式的 underscore 在.下面劃線 initially 最初,開頭 reforma...

QT程式設計 day3

當建立乙個專案之後,資料夾裡會有6個檔案。其中有乙個為.pro.user檔案,這個檔案不屬於專案源 的一部分,它是qtcreator專屬的使用者定製專案設定,儲存了這個專案本地化的設定。qtcreator開啟專案時會讀取這個設定檔案,比較該專案裡的檔案配置與當前的專案位置等是否符合,符合就載入配置,...

北京集訓DAY3

消去合法的序列 剩下的不合法序列一定是 3兩種括號個數各加1除2 手算一下即可4 5 include 6 include 7 include 8 9const int maxn 100010 10 11int len,top,cnt 1213 char s maxn 1415 inthh 25int...