---
# System prepended metadata

title: 優質題單
tags: [校內培訓]

---

# 優質題單

# 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)













