國慶七天樂 第三天

2022-05-18 05:22:31 字數 4590 閱讀 3465

【【動態規劃】】

【基礎內容】

狀態設計:往往是觀察在搜尋過程中需要用到的引數,所表

示的含義往往是「最大」、「最小」、「方案總數」、「0/1」。

狀態轉移方程一般以數列遞推的形式給出,在研究如何**實現

轉移設計:狀態都有什麼,應該如何轉移,

注意無後效性

【線性動態規劃】(所有你不能分到其它類裡的dp就叫線性動態規劃)

1攔截飛彈

f[i]表示到第i個數的最長上公升子串行的長度

f[i]=1

g[x]表示以不大於x結尾的最長上公升子串行,單調不減

f[i]=1

g[a[i]-1]+1   j#n^2#

優化:用樹狀陣列來優化ànlogn

2攔截飛彈+

求方案數。

開乙個g[i]陣列來表示當前這個數是由之前的幾個數轉過來的

g[i]=sigma(g[j]) ,  ja[j]>a[i]

去重1:g只加最近的滿足條件的g[j]

去重2:在整個數列的末尾(++n)加乙個inf/max

這樣在找最長上公升子串行時,長度就直接是f[n],最後的答案就是g[n].(更加優美)

3數字三角形

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

a是字首和

4.數字三角形+(所得和數對233取模)

f[i][j][k]=f[i-1][j][(k-a[i][j]+233)%233]

| f[i-1][j-1][(k-a[i][j]+233)%233]

因為模數很小,所以可以用同餘類來優化,

把餘數相同的數分為一類,再加一維

因為c++負數取模還是負數,所以要再加233來防止出現素數

5.數字三角形++(有必須經過的點)

紅點為必須經過的點

藍色方框為可能經過路線的範圍

這樣我們dp的範圍就限制在了每個方塊內了,減少了計算量 

【區間動態規劃】

多邊形表示式(環)

先化簡:已知表示式,求加括號後的最大值

f[i][j]表示從i到j的表示式加括號後可達到的最大值

g[i][j]表示從i到j的表示式加括號後可達到的最小值

f[i][j]= 列舉k   f[i][k-1] opk f[k+1][j]   +  *

f[i][k-1] opk g[k+1][j]   -

g[i][k-1] opk k[k+1][j]   *

g[i][k-1] opk g[k+1][j]   *

分別來表示每種運算的最優結果

回歸原題,多邊形表示式,就是把乙個環刪掉一條邊,變成一條鏈,然後依次列舉斷開的邊,但顯然這樣做是超時的,所以我們把這個鏈乘2,在去列舉每乙個起點(長度為n),這樣就可以依次遍歷了(破環成鏈經典做法)

取數問題

f[i][j][k]表示時刻i,佇列變為j-k的最大值

ans=f[n][j][j-1];

f[i][j][k]  max  =f[i-1][j][k-1]+a[k]*t[i]

f[i-1][j+1][k]+a[j]*t[i]

當前這個時刻,取左右端點的最大值,當前這個時刻,由上乙個時刻推來。如果是優化的話,可以把i這一維刪掉。因為i=n-(k-j+1),所以用i的地方都可以用n-(k-j+1)代替(ti=總長-當前長)

f[i][j][k]  max  =f [j][k-1]+a[k]*t[n-(k-j+1)]

f[j+1][k]+a[j]*t[n-(k-j+1)]

合併果子 (堆)à哈夫曼編碼

找到乙個編碼(無歧義)方式,試每個字串的長度*出現次數的和最小。

實現方法就是維護乙個每次合併前k小的優先佇列

合併石子(相鄰)

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

合併石子+ 任意合併相鄰2到n堆,求最少能量的消耗

腦筋急轉彎解法:直接全部合併就好了。

合併石子++ 每次任意合併至少k堆,求最少能量的消耗

依舊是維護乙個優先佇列,但是要在佇列末尾補0,來保證一定能實現k堆的合並且不影響答案。(小技巧)

刪數遊戲

f[i][j]表示i-j能否被刪完(bool)

f[i][i]=0,f[i][i-1]=1

表示乙個空區間,空區間是刪除成功的,所以為1,同時也是為了下面打碼方便。

f[i][j] |=(f[i][k-1]&f[k+1][l-1]&f[l+1][j])&a[l]-a[k]∈a)

左邊被刪完了,中間被刪完了,右邊被刪完了,而且它們的等差在a裡面。

優化:因為乙個ak不可能出現在兩個x中間這種情況(這兩個x滿足被刪掉的理由),因為一旦出現了,那就說明ak應該早就被刪掉了,所以只有可能是左邊刪完,右邊刪完。

f[i][j] |=f[i-1][k-1]&f[k+1][j] &a[l]-a[k]∈a) if[i+1][j-1]&(a[j]-a[i] ∈a) k==j

/************** |= 或等於 ****************************/

在所有的情況中,只要有一種是滿足的就是1,否則為0

8.刪數遊戲+  刪去2到3個長度的連續等差數列

分類討論

兩個長度的同上,三個長度的如下

f[i][j]|=f[i][l]&f[l+1][j]&a[l]+a[i]=2*a[k]&a[k]-a[i]in a

之前是列舉它的k的位置,怎麼刪,然而我們並不關心這個,我們只需要知道它能不能刪就好了,所以依然是左右兩段。

【記憶化搜尋】

記憶化搜尋其實是一種dp 求解的方法,而非特定的問題。

該方法一般用於較難確定更新順序的dp 問題。

1. 滑雪

f[i][j] 表示到(i,j)的單調遞減序列長度

f[i][j] max = f[i][j+1]+1,  a[i][j+1]>a[i][j]

f[i+1][j]+1,  a[i+1][j]>a[i][j]

f[i][j-1]+1,  a[i][j-1]>a[i][j]

f[i-1][j]+1,  a[i-1][j]>a[i][j]

滑雪的從上到下且不會回去的性質確定了這個題的無後效性,所以這個題可以用dp做。

列舉四個方向取乙個max,同時不要忘了確定邊界。

/********記憶化的精髓**************************/

if(vis[i][j]) return vis[i][j]

2. 數字三角形++

if(x1==x2&&y2!=y1) return –inf;

本來在起點的兩個座標的y值不相等

if(vis[x2][y2]) return vis[x2][y2];

if(y2往左下走,不可能

if(x2<=x1) return –inf;

向上走,不可能

【揹包問題】

揹包動規是一類經典的裝箱問題的解決方案,也是將數值放

入dp 方程的典型代表。

1.0/1揹包

for(i:1-n)

for(j:m-1)

f[j]=max(f[j],f[j-w[i]]+c[i];

2.完全揹包

for(i:1-n)

for(j:1-m)

f[j]=max(f[j],f[j-w[i]]+c[i];

3. 多重揹包

二進位制優化,

單調佇列優化,剩餘類分類à滑動視窗à單調佇列。

f[i][t] max =f[i-1][++j*w[i]]+j*c[i]

0<=j<=k[i],j*w[i]+t<=m

step1:

f[i][r+p*w[i]]*w[i]] max=g[i-1][r+(i+p)*w[i]]

0<=j<=k[i], (j+k)*w[i]+r<=m

step2:

f[i][r+p*w[i]]-=p*c[i];

#m*sigma(ki)#

4. 厲害一點的暴力揹包

題面:乙個容量為m 的揹包,有n 個物品,第i 個物品的體積為wi,價值為ci。選擇若干物品,使得體積總和不超過m 的情況下價值總和最大。

n<40,m 可能很大meet in the middle!

解法,講n分成兩部分,

a 表示在前半部分中資料從小到大

b 前半部分的價值

c 表示在後半部分中資料從大到小

d 後半部分的價值

在a中列舉斷點,因為an+cn<=m,所以可以確定cn,(都是乙個範圍)然後分別在其中找到所有裡的最大的價值相加,就是當前這個斷點的最優值,然後在所有最優值中找出最值,就是結果

5. 圓滑數

乘積末尾為0的數只有兩種,

有乙個(或多個)數本身為0

2*5;

所以我們就先求出2,和5在每個數里(乘積)出現的次數,(n2,n5)然後就是乙個揹包問題來計算所有數中2和5的數(試從中選k個)

f[i][k][j]=max(f[i-1][k][j],f[i-1][k-1][j-n5[i]]+n2[i])

ans=max(ans,min(j,f[n][k][j])

如果資料中有0的話,要加特判,保證不能為0

if(a[i]==0)

揹包的判斷也要改成

if(j>=n5[i]&&!vis[i])

國慶七天收穫總結

經過這一周和其他同學的努力,我在學習方面有很大收穫,具體如下。為了更高效的運用電腦,練習使用快捷鍵是必要的。在這七天,我主要學習使用了這些快捷鍵 win 將所選視窗移動到螢幕左 右側並將大小調整為一半螢幕的大小,在此基礎上可以繼續按win 進一步分屏。win 呼叫放大鏡,可以放大螢幕,在展示時可用。...

程式設計師,國慶七天如何樂起來?

cctv的國慶七天樂曾給俺留下一些隱隱約約的印象,畢叔叔是乙個看似幽默風趣的主持人,怎麼說都比極度煽情的倪大媽趙大爺朱大叔好上幾百倍,每年春晚都要被他們搞得渾身雞皮疙瘩好幾次,畢叔叔帶著幾個長相誇張的搞笑專家一起折騰,還真能折騰出一些樂趣與笑聲!俺做程式設計師八年之久,期間痛苦多於快樂,加班多於上班...

程式設計師,國慶七天如何樂起來?

cctv的國慶七天樂曾給俺留下一些隱隱約約的印象,畢叔叔是乙個看似幽默風趣的主持人,怎麼說都比極度煽情的倪大媽趙大爺朱大叔好上幾百倍,每年春晚都要被他們搞得渾身雞皮疙瘩好幾次,畢叔叔帶著幾個長相誇張的搞笑專家一起折騰,還真能折騰出一些樂趣與笑聲!俺做程式設計師八年之久,期間痛苦多於快樂,加班多於上班...