假期集訓(1)簡單dp隨記

2021-10-08 00:28:05 字數 1371 閱讀 8170

簡單線性dp:

反覆利用前態推出後態

上公升子串行:

for

(int i=

1;i<=n;i++

)dp[i]

=a[i]

;for

(int j=

1;j(a[i]

>a[j]

) dp[i]

=max

(dp[i]

,dp[j]+1

)

01揹包:

從後往前遍歷

for

(int i=

1;i<=type;i++

)for

(int j=weight;j>=w[i]

;j--

) dp[j]

=max

(dp[j]

,dp[j-w[i]

]+val[i]

完全揹包:

從前往後遍歷

for

(int i=

1;i<=type;i++

)for

(int j=w[i]

;j<=weight;j++

) dp[j]

=max

(dp[j]

,dp[j-w[i]

]+val[i]

多重揹包:

二進位制拆分 + 01揹包

for(int j=

1;j<=num;j<<=1)

if(num>0)

泛揹包:

從右上開始遍歷

hdu1712

for

(int i=

1;i<=n;i++

)//種類

for(

int j=m;j>=

1;j--

)//剩餘容量

for(

int k=

1;k<=j;k++

)//在第i種上花費容量k

dp[j]

=max

(dp[j]

,dp[j-k]

+a[i]

[k])

;

分組揹包:

①每組最少拿乙個

hdu3033

int n,m;

//n組,容量m

for(

int i=

1;i<=n;i++)

③多種多組揹包的組合

hdu3535

記憶化搜尋:

power oj2842

dfs+dp陣列進行記憶

清華集訓2014 簡單迴路 插頭DP

鏈結 直接做q qq次插頭dp得分為60 6060 考慮題目中只詢問了豎直的邊,所以考慮分別做一遍前字尾插頭dp,記錄下每一行的每種輪廓線對應的方案數,詢問時合併輪廓線。兩條輪廓線互補相當於把輪廓線上的邊連起來能形成乙個環,用並查集判就行了。include using namespace std t...

最大全1正方形(簡單dp)

描述 飛哥最近 得到 了一大塊 n m 的土地 他想在這塊土地 上建乙個正方 形的農場 但是 這塊土 地有些地方 被大石頭 佔著,無法 使用 於是 飛哥想來問你 在這塊土地 上能建成的農場 的最大 邊 長為多少 輸入第乙個數t表示陣列組數 每組 資料 一開 始有兩個 整數 n和 m,表示 土地 的長...

動態規劃專題 1 簡單線性DP

本專題文章建立在本人多年寫動態規劃 的經驗上,用以自己回顧總結,也幫助朋友初步理解,部分理解可能和教科書有所出入,要參加演算法考試的同學請以教科書為準。在現實生活中,有一類活動的過程,由於它的特殊性,可將過程分成若干個互相聯絡的階段,在它的每一階段都需要作出決策,從而使整個過程達到最好的活動效果。因...