算法大地講解
Joe Tsai @ 2020 CSIECamp
口罩爭奪戰
範例
4
9
3
7
5
2
4
9
3
7
5
2
範例
4
7
3
9
5
2
紅色總和: 12
藍色總和: 18
7
5
2
4
9
3
策略
當牌數是偶數時,先手有必定不敗的優勢!
更好的策略?
4
2
1
3
4
2
1
3
4
3
2
1
3
4
2
1
2
3
4
1
1
3
2
1
2
1
4
2
1
3
2
1
2
1
4
2
1
3
2
1
2
1
4
2
3
1
1
2
1
2
2
4
max: 3
max: 2
max: 2
max: 4
至少可得4+2
至少可得3+2
動態規劃
簡稱 DP (Dynamic Programming)
滿足以下條件時就是DP登場的時候了!
- 最佳子結構: 大問題的最佳答案可以由小問題的最佳答案來得到!
- 重疊子問題: 在拆解大問題時,會重複遇到相同的小問題!
資訊營趴趴躁
眼花撩亂...
化繁為簡
0
1
3
2
4
5
4
1
5
7
2
4
3
Dijkstra 演算法
- 建立一個距離的表格,除了起點的距離設為 0,其他點都設為無窮大。
- 選擇當前未註記的所有點中,與起點距離最小的點,稱之為 s。
- 對於所有與 s 點相鄰的點,檢查是否能透過經過 s 來找到更短的路徑。如果有則更新距離表格。
- 將 s 註記。
- 如果還有未註記的點,回到 2. ,否則所有最短路徑距離都已經被找到。
範例
0
1
3
2
4
5
4
1
5
7
2
1
3
點 | 距離 |
---|---|
0 | 0 |
1 | inf |
2 | inf |
3 | inf |
4 | inf |
5 | inf |
範例
0
1
3
2
4
5
4
1
5
7
2
1
3
點 | 距離 |
---|---|
0 | |
1 | 4 |
2 | inf |
3 | inf |
4 | inf |
5 | inf |
範例
0
1
3
2
4
5
4
1
5
7
2
1
3
點 | 距離 |
---|---|
0 | |
4 | |
2 | 5 |
3 | 9 |
4 | inf |
5 | inf |
範例
0
1
3
2
4
5
4
1
5
7
2
1
3
點 | 距離 |
---|---|
0 | |
4 | |
5 | |
3 | 9 |
4 | 8 |
5 | 12 |
範例
0
1
3
2
4
5
4
1
5
7
2
1
3
點 | 距離 |
---|---|
0 | |
4 | |
5 | |
3 | 9 |
8 | |
5 | 9 |
範例
0
1
3
2
4
5
4
1
5
7
2
1
3
點 | 距離 |
---|---|
0 | |
4 | |
5 | |
9 | |
8 | |
5 | 9 |
範例
0
1
3
2
4
5
4
1
5
7
2
1
3
點 | 距離 |
---|---|
0 | |
4 | |
5 | |
9 | |
8 | |
9 |
最佳順序管理大師
排序
排序非常常見且實用,例如
- 小隊總積分排名
- 考大學選科系
- 音樂/電影排行榜
- .....
排序在資工領域是非常基本&常用的概念
常見排序法
泡沫排序法 (Bubble sort)
Bubble Sort 的方式是從序列的最前面開始,一次比較序列中兩兩相鄰的元素,然後根據大小將它們調換順序,大的移到後面:
- 當我們比較過所有元素一次後,可以確保數值最大的元素在最後面
- 接著扣掉序列中的最後一個元素(因為已經確定它是最大的),接著重複上面的步驟進行兩兩比較
- 重複上述動作,直到排序完畢。假設這個序列有 6 個元素一共需重複這個動作 5 次才能確保排序完畢。
常見排序法
喬蔡的奇妙冒險
round 1
規則: 一堆30顆石頭,雙方輪流拿取,一次可以取1/3/4/5顆,拿走最後一顆石頭者獲勝。
round 1
考慮現在有n顆石頭,已知情況(顯而易見):
- n=1,先手必勝
- n=2,後手必勝
- n=3,先手必勝
- n=4,先手必勝
- n=5,先手必勝
- n=6,???
round 1
1
3
4
5
6
5
3
2
1
我:敗
勝
敵:勝
我:敗
敵:勝
我:勝
敵:敗
我:敗
敵:勝
round 1
解法:
對於n顆石頭,考慮n-1, n-3, n-4, n-5顆石頭的勝負情況。只要有任何一個是敵方必敗,則n顆石頭的情況可以必勝。
反之,若所有情況都是敵人必勝,則n顆石頭的情況必敗。
round 2
規則: 三堆石頭分別有4/6/8顆,雙方輪流拿取,每次任選一堆拿走任意非零數量的石頭,拿走最後一顆石頭者獲勝。
round 2
這種類型的遊戲稱為Nim(粘),有標準解法。
round 2
複習一下
二進位
20 (10100)
27 (11011)
round 2
複習一下
Xor
1
0
1
0
0
1
1
0
1
1
0
1
1
1
1
round 2
round 2
想法:
策略:
定理一:
定理二:
Explosion
名詞介紹
- 一個 literal: a, (not b)
- 一個 clause: a or b
- 一個 2-SAT 表達式: (clause) and (clause) and ...
- 範例: (a or b) and (a or c) and (not b or d)
2-SAT問題: 想要找到一組 true/false 的分配,使得表達式的結果是 true
2-SAT 解法
略
2-SAT 問題有快速有效率的解法(對電腦而言),但其解法概念牽扯到更複雜的演算法知識,超過此營隊的範圍....
問題
名詞解釋
- X0 這個 literal 代表第零橫路的方向向右
- 同理定義 X1,X2,X3
- Y0 這個 literal 代表第零直路的方向向下
- 同理定義 Y1,Y2,Y3
化為2-SAT
從 A 走到 P 可以選擇:
- 第零橫路 + 第三直路
- 第零直路 + 第三橫路
相當於
(X0 and Y3) or (X3 and Y0)
化為 2-SAT
(X0 or X3) and (X0 or Y0) and (Y3 or X3) and (Y3 or Y0)
解法
將每個需要達成的目標都表示成 2-SAT 表達式,全部 and 起來就可以解得每一條路的方向!
頒獎
2020資訊營算法大地講解
By JT
2020資訊營算法大地講解
- 860