算法大地講解

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 演算法

  1. 建立一個距離的表格,除了起點的距離設為 0,其他點都設為無窮大。
  2. 選擇當前未註記的所有點中,與起點距離最小的點,稱之為 s。
  3. 對於所有與 s 點相鄰的點,檢查是否能透過經過 s 來找到更短的路徑。如果有則更新距離表格。
  4. 將 s 註記。
  5. 如果還有未註記的點,回到 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 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 0
1 4
2 5
3 9
4 inf
5 inf

範例

0

1

3

2

4

5

4

1

5

7

2

1

3

距離
0 0
1 4
2 5
3 9
4 8
5 12

範例

0

1

3

2

4

5

4

1

5

7

2

1

3

距離
0 0
1 4
2 5
3 9
4 8
5 9

範例

0

1

3

2

4

5

4

1

5

7

2

1

3

距離
0 0
1 4
2 5
3 9
4 8
5 9

範例

0

1

3

2

4

5

4

1

5

7

2

1

3

距離
0 0
1 4
2 5
3 9
4 8
5 9

最佳順序管理大師

排序

排序非常常見且實用,例如

  • 小隊總積分排名
  • 考大學選科系
  • 音樂/電影排行榜
  • .....

排序在資工領域是非常基本&常用的概念

常見排序法

泡沫排序法 (Bubble sort)

Bubble Sort 的方式是從序列的最前面開始,一次比較序列中兩兩相鄰的元素,然後根據大小將它們調換順序,大的移到後面:

  • 當我們比較過所有元素一次後,可以確保數值最大的元素在最後面
  • 接著扣掉序列中的最後一個元素(因為已經確定它是最大的),接著重複上面的步驟進行兩兩比較
  • 重複上述動作,直到排序完畢。假設這個序列有 6 個元素一共需重複這個動作 5 次才能確保排序完畢。

常見排序法

泡沫排序法 (Bubble sort)

 

看點例子更清楚

喬蔡的奇妙冒險

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)

\rightarrow
\rightarrow

round 2

複習一下

Xor

1

0

1

0

0

1

1

0

1

1

0

1

1

1

1

\oplus

round 2

假設石頭共有n堆,每堆分別有a_1,a_2,\dots,a_n顆石頭\\ 我們計算s = a_1\oplus a_2 \oplus \dots \oplus a_n,\\ 若s\not=0,則先手必勝,反之後手必勝

round 2

當沒有任何石頭時,s=0

想法:

策略:

每當輪到你的回合時,想辦法讓s=0

定理一:

當輪到你時,如果s\not=0,你總能操作讓s=0

定理二:

當輪到你時,如果s=0,任何操作一定讓s\not=0

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 起來就可以解得每一條路的方向!

頒獎

Made with Slides.com