AP325 練習題單
一、遞迴
1.1. 基本觀念與用法
1.2. 實作遞迴定義
1.3. 以遞迴窮舉暴搜
二、排序與二分搜
2.1. 排序
2.2. 搜尋
d024: 例題 P-2-15. 圓環出口 (APCS202007)
- 前綴和(prefix sum)
- 二分搜
- 解題參考
- 因為 qi 不會超過 p 的總和,所以將原序列複製一次再求前綴和,可簡化操作。如果沒有此限制,也只需將 qi 預先 mod p的總和即可。
2.3. 其他相關技巧介紹
快速冪
d013: 習題 Q-2-4. 快速冪–200 位整數
- x 超過long long,先求 x % p
- 以 string 讀取 x,將每個字元轉成數值的過程,不斷%p。
- 例如 x=123=(1*10+2)10+3,x%p=((((110%p+2)%p)*10)%p+3)%p
模逆元
快速計算費式數列
2.4. 其他例題與習題
三、佇列與堆疊
3.1. 基本原理與實作
3.2. 應用例題與習題
堆疊
佇列
滑動視窗(Sliding window)
d037: 習題Q-3-13. X差值範圍內的最大Y差值
- 先對 x 座標排序。
- 宣告 deque<int> max_q,min_q; max_q 記錄 L 區間 y 最大值的索引,min_q 記錄 L 區間 y 最小值的索引。
- 當元素要從窗戶右端放入max_q時,先從前端移除超過L的點(離開窗戶),再從後端移除所有小於它的點(這些點對找最大值沒用,max_q為遞減序列),然後push_back至max_q內。
- min_q同理從後端移除所有大於它的點。
- 以迴圈讓窗戶的右端逐步往右推,處理完畢後 max_q.front()為窗戶內的最大值的點,min_q.front()為最小值的點。
四、貪心演算法與掃瞄線演算法
4.1. 基本原理
4.2. 例題與習題
4.2.1. 單欄位資料排序
4.2.2. 結構資料排序
d046: 例題 P-4-5. 嵩山磨劍坊的問題(加權最小完成時間)
- t/w 值小的排在前面,
- 假設磨a,b之前劍所需的時間為x,則之前的順序,不會影響(a,b)或(b,a)的扣款總額的計算,所以只要考慮a,b順序即可。
- (a,b)-> [x+t(a)]*w(a) + [x+t(a)+t(b)]*w(b) = x(w(a)+w(b)) + t(a)*w(a) + t(b)*w(b) + t(a)*w(b)
- (b,a)-> [x+t(b)]*w(b) + [x+t(a)+t(b)]*w(a) = x(w(a)+w(b)) + t(a)*w(a) + t(b)*w(b) + t(b)*w(a)
- 依兩兩劍(a,b)完成時間*重要性的值排序(a.t * b.w < b.t * a.w)
d047: Q-4-6. 少林寺的自動寄物櫃(APCS201710)
- 假設a,b其上物品的重量為x,則這些物品的順序,不會影響(a,b)或(b,a)消耗的能量的計算,所以只要考慮a,b順序即可。
- (a,b)-> x*f(a) + (x+w(a))*f(b) = x(f(a)+f(b)) + w(a)*f(b)
- (b,a)-> x*f(b) + (x+w(b))*f(a) = x(f(a)+f(b)) + w(b)*f(a)
- 依兩兩物品(a,b) 其上重量*頻率的值排序(a.w * b.f < b.w * a.f)
4.2.3. 以PQ處理動態資料(*)
4.2.4. 外掛二分搜
4.2.5. 掃描線演算法sweep-line
4.3. 其他習題
五、分治演算法
5.1. 基本原理
5.2. 例題與習題
六、動態規劃
6.1. 基本原理
6.1.1. 基本思維與步驟
6.1.2. 狀態轉移
6.1.3. 分類與複雜度
6.1.4. Top-down memoization
6.2. 例題與習題
6.2.1. 1D0D
d072: Q-6-4. 闖關二選一
- 每個關卡通過的成本只跟上一關有關(跟更早的無關),設dp[i][j]為第i關、第j種狀態的最低成本(i<=n,j=0或1)。
- dp[i][j] = min( dp[i-1][0]+abs(pwd[i-1][0]-pwd[i][j]), dp[i-1][1]+abs(pwd[i-1][1]-pwd[i][j]) );
6.2.2. 2D0D
6.2.3. 1D1D
6.2.4. 2D1D與其他
6.3. 進階題(*)
七、基本圖論演算法
7.1. 基本觀念與名詞
7.2. 資料結構與基本演算法
7.2.1. 資料結構
7.2.2. BFS
7.2.3. DFS
7.2.4. DAG與topological sort
7.4. 補充教材(*)
7.4.1. Dijkstra演算法
7.4.2. 併查集(Union and Find)
7.4.3. 最小生成樹
八、樹上演算法
8.1. 基本觀念與名詞
8.2. 樹的儲存與基本演算法
8.2.1. 儲存樹的資料結構
8.2.2. DFS
8.2.3. BFS
8.2.4. 由下而上的走訪
8.3. 例題與習題
二元樹
樹的最大獨立集