# 優質題單
# DP Time
:coffee::coffee::coffee::coffee::coffee:
:coffee::coffee::coffee::coffee::coffee:
:tea::tea::tea::tea::tea:
優質DP入門講義:[[SA's DP]](https://hackmd.io/@sa072686/DP)
:tea::tea::tea::tea::tea:
---
## 前言
DP Time 是 DP 題單,這個題單的題目都是**樸素**DP。
樸素的意思是理論上不需要帶優化就可以解的出來了
(但是 LIS 的 BIT 太經典了)
---
## 0.1 看到DP怎麼下手
我也想知道QQ
## 0.2 線性DP
什麼叫做線性DP呢?其實就是最基本的DP
沒有特別分出來的東西都叫線性DP
所以說線性DP可能是遞推or遞迴or多維or其他阿撒布魯的
通常是簡單題( 難題也很多就是了(x ),但是不一定會直接裸裸的出現在題目裡
有時候會是在解題的過程中的一小部分
(如果硬要說的話前綴和也算一種DP(x 所以說前綴和也很重要 dayo!)
因為我相信你們都很會DP了,所以說我這邊就不負責任的不放題目了...(x
雖然我很想這麼說,但是練好線性DP才是進入後面恐怖東西的第一步
所以來刷題囉(以下題目可能有按難度分,沒有提示,就是大雜燴)
1. [[LG 1077]](https://www.luogu.com.cn/problem/P1077)
2. [[LG 1541]](https://www.luogu.com.cn/problem/P1541)
3. [[LG 4059]](https://www.luogu.com.cn/problem/P4059)
4. [[CF 118D]](https://codeforces.com/problemset/problem/118/D)
5. [[CF 607A]](https://codeforces.com/problemset/problem/607/A)
6. [[UVA 1347]](https://vjudge.net/problem/UVA-1347) 經典題:兩相異路徑最短路
因為線性DP太多了,我隨便選幾題看起來不錯的就丟上來了
CF題來源大部分是這個題單 [[DP Practice]](https://vjudge.net/contest/424603)
## 1. LIS と LCS
### LIS 什麼的最喜歡了 >//<
LIS 就是一個二維偏序問題,套個 BIT 可以解決很多問題
但是也別忘記 LIS 原本的 DP 式了
1. [[N維偏序]](http://domen111.github.io/UVa-Easy-Viewer/?103)
2. [[LIS變形1]](https://ac.nowcoder.com/acm/contest/11164/D?&headNav=acm)
3. [[LIS變形2]](https://codeforces.com/problemset/problem/1468/A)
4. [[LIS變形3]](https://codeforces.com/group/zrTK4HK8Ew/contest/296734/problem/A) (未解)
### LCS 什麼的最討厭了 OAO
1. [[LCS變形1]](https://atcoder.jp/contests/abc130/tasks/abc130_e)
### 聽說 LCS 可以轉 LIS ?
什麼意思? Almost 裸題 是一個 LIS
如果我把 $x$ 座標換成 $a_i$, $y$ 座標換成 $b_i$
求 LCS 就變成跟那題求的東西一樣了 $\therefore LCS == LIS$
什麼時候可以用? 只需要輸出長度的時候
你說建圖也要 $NM$?數字小的時候可以Counting sort。數字大?離散化
複雜度?$O(Klog(min(N,M)) + R)$ 。$K$是數對數目, $N$ 和 $M$ 是序列長度,$R$是數字範圍。
最差情況下比 $O(NM)$ 還糟,但大部分時間快一點。$K$ 越小時可以用
1. [[UVA 10635]](https://vjudge.net/problem/UVA-10635)
---
## 2. 二維 DP
這邊的二維DP是在二維的平面上做DP,不是說狀態只有二維
1. 還有很多但是我懶得找了,Atcoder上很多好題
---
## 3. 背包 DP
背包博大精深,千萬不要覺得他很簡單,難死
簡單分類:
* 0/1 背包
* 無限背包
* 有限背包
* 分組背包
* 樹上背包
先上裸題
* 樹上背包 先等等 樹DP那邊再來
要注意的幾件事:
1. 背包是DP,不要硬套
2. 無限背包沒想好就會變成有限背包,要小心
3. 應該還有 但是我想不到
例題:
1. [[CF 336C]](https://codeforces.com/problemset/problem/366/C)
2. [[LG 1954]](https://www.luogu.com.cn/problem/P1941)
3. [[LG 1858]](https://www.luogu.com.cn/problem/P1858) 01背包前 $k$ 優解的價值和
4. [[CF 864E]](https://codeforces.com/problemset/problem/864/E) (未解)
## 4. 區間DP
在區間上做DP,通常複雜度都是 $N^2,N^3$
有時候可以搭配莫名其妙的四邊形優化
**用遞迴寫會異常好寫**
先來一些簡單經典題暖身
再來一些比較難一點點的經典好題
1. [[105全國賽pD變化]](https://vjudge.net/contest/400091#problem/H)
2. [[CF149D]](https://codeforces.com/problemset/problem/149/D) 特殊的轉移方式
3. [[IOI1998]Polygon](https://www.luogu.com.cn/problem/P4342) (未解)
4. [[顏色消除1]](https://codeforces.com/gym/102835/problem/E)
5. [[顏色消除2]](https://vjudge.net/problem/UVA-10559) (未解)
## 5. 環狀DP
如果解完石子合併的話你們應該學到了一個斷環成鍊的技巧了
但那個通常只有在區間DP可以用
正常的環狀DP作法是這樣子的:看哪裡有環,找環上一個點,枚舉他的所有Case,然後他就變成鍊了
環狀DP只是一個概念(技巧)而已,他不常裸裸的出現,所以說不放題目囉 OuO
其實是我懶(誤
## 6. 狀壓DP(位元DP)
貌似有人叫他位元DP,不要跟數位DP搞混了喔
### 6-1 $O(2^n)$
狀壓DP很常拿來把原本是 $N!$ 的複雜度壓成 $2^N$
大部分的做法就是用一個整數來表示一個狀態
令 $cnt(mask)$ = $mask$ 中 $1$ 的數量
最常見的手法是 $dp(mask)$ 代表前 $cnt(mask)$ 個人狀態是 $mask$ 的答案
上題目囉~
1. [[LG 2704]](https://www.luogu.com.cn/problem/P2704) 題目簡單但細節頗多
2. [[CF11D]](https://codeforces.com/problemset/problem/11/D)
### 6-2 $O(3^n)$ 枚舉子集的狀壓dp
這裡的 $3^n$ 不是指說用 $3$ 進制的整數存,一樣是二進制的整數當作狀態
最常見作法:先枚舉 $0\sim 2^n-1$,然後每一個再去做 dfs 枚舉子集
複雜度證明:$(2+1)^n=\sum\limits_{i=1}^{n}2^i\cdot$$n\choose i$
1. [[LG 3959]](https://www.luogu.com.cn/problem/P3959) 按層轉移
2. [[CF1209 E2]](https://codeforces.com/problemset/problem/1209/E2) (未解)
### 5-3. 輪廓線DP
這是一個困難的DP,我不太會,但是他蠻有趣的
他其實算是一種狀壓DP的分支,但又不完全是
1. [[CSES 2181]](https://cses.fi/problemset/task/2181)
## 6. 樹DP
這是一個恐怖的章節,因為我不會樹DP
樹DP比背包還要博大精深,他自己一個DP就延伸出很多分支了
但也因為這樣,他非常重要,可以說是DP的非常大個章節
主要有以下分支:
1. 普通DP
2. 樹上背包
3. 換根DP
4. 基環樹(只有一個環的樹)
5. 其他毒瘤(虛樹、長鍊剖分)
下面是一些 MISC 的題目,主要去看洛谷題單
1. [[好好寫就是 $O(n^2)$ 樹 dp]](https://acm.timus.ru/problem.aspx?space=1&num=1018)
2. [[TOI 2020 pB 推廣題]](https://codeforces.com/group/zrTK4HK8Ew/contest/296734/problem/C)
題單:[[洛谷樹DP]](https://www.luogu.com.cn/training/13994#problems)
---
###### tags: `校內培訓`
# 資料結構題單
## 自習資源
[CF edu](https://codeforces.com/edu/courses)
## 並查集 和 啟發式合併
[類似某次APCS第三題](https://cses.fi/problemset/task/1163)
[帶權並查集 二分圖](https://www.luogu.com.cn/problem/P1525)
這幾題都可以用 `擴展域` 和 `帶權並查集` 兩種方法來實作
[更多帶權並查集](https://www.luogu.com.cn/problem/P1196)
[更多掃描線](https://www.luogu.com.cn/problem/P1502)
[更多線段樹](https://cses.fi/problemset/task/2206)
Lazy Tag 在下傳的時候須考慮到各種狀況和先後順序非常重要
## 動態開點線段樹
[氣球博覽會](https://tioj.ck.tp.edu.tw/problems/1169)
全世界都會 就我不會 我弱
## 可持久化線段樹
[經典題 - 區間第k小](https://www.luogu.com.cn/problem/P3834)
[難題](https://codeforces.com/contest/484/problem/E)
[區間相異元素個數 變化題](https://codeforces.com/contest/813/problem/E)
[可持久化 + 合併 (未解)](https://codeforces.com/contest/893/problem/F)
## BIT
[有趣的一題](https://atcoder.jp/contests/abc201/tasks/abc201_f)
## 有趣應用
[線段樹優化建圖](https://codeforces.com/problemset/problem/786/B)
[線段樹優化建圖 + 網路流(未解)](https://codeforces.com/problemset/problem/793/G)
[線段樹 + 回滾並查集]電~(https://codeforces.com/contest/813/problem/F)