5.4k 5 分鐘

# DFS # 想法 深度優先搜尋法(Depth-First Search)是一種樹(Tree)或圖(Graph)資料結構的搜索演算法,從圖的某一節點 (vertex, node) 開始走訪,盡可能最深入到分支深處再回溯其他節點。可應用於有向圖與無向圖的搜尋。 # 動圖演示 # 方法 運用遞迴的方式,不斷的往合理的狀況往下探索,直到無法在往下探索後返回,直到把所有狀況都跑過一遍,有時需要用到 stack 去幫忙輔助。 # 用途 用於拓撲排序,解決需要圖形回溯的問題,檢測圖形中的循環,查找兩個節點之間的所有路徑等。當然,還有很多喔~~ # tree search...
4.7k 4 分鐘

# 遞迴 # 上課例題 # a623: 3. Combination 從 n 個物品取 m 個的組合是一個在數學及企業中常用的值。 本題的程式要讀入 n 和 m 的值,輸出從 n 個物品中取出 m 個的不同組合有幾種。 運用公式 Ckn=Ckn−1+Ck−1n−1C^n_k = C^{n-1}_k + C^{n-1}_{k-1}Ckn​=Ckn−1​+Ck−1n−1​ 做遞迴 在n=kn=kn=k 或k=0k=0k=0 時,就只會有 1 種 #include<iostream>using namespace std;int c(int n, int...
1.9k 2 分鐘

# 課堂練習 # f627: 1. 礦砂採集 https://zerojudge.tw/ShowProblem?problemid=f627 這是一個典型的部分背包問題, 每一次取礦石都取當前剩下性價比 (CP 值) 最高的礦石。 運用 pair 分別紀錄初始重量以及單位重量價值 (CP 值)。 再使用自定比較函式,由高到低排序 CP 值。 當背包還有空間時,就不斷的提取。 #include <bits/stdc++.h>using namespace std;#define pii pair<int,int>bool comp(pii a,pii...
3.9k 4 分鐘

# 線性變換 linear transformation # 定義 令V,WV,WV,W 都是建立在體FFF 的向量空間, T:V→WT:V \rightarrow WT:V→W 稱作VVV 的WWW 的線性轉換。 並且,TTT 也滿足以下兩點: T(x+y)=T(x)+T(y)∀x,y∈VT(x+y) = T(x) + T(y) \forall x,y \in VT(x+y)=T(x)+T(y)∀x,y∈V T(cx)=cT(x)∀c∈F,∀x∈VT(cx) = cT(x) \forall c \in F ,\forall x \in...
3.3k 3 分鐘

# 線性獨立 / 相依 linear dependent/independent # 定義 令 S=v1,...vn⊂VS = {v_1,...v_n} \subset VS=v1​,...vn​⊂V,若存在不全為 0 的c1,c2,...,cn∈Fc_1,c_2,...,c_n \in Fc1​,c2​,...,cn​∈F 使得 ∑i=0ncivi=0\sum_{i=0}^{n}c_iv_i = 0∑i=0n​ci​vi​=0 => SSS 稱為VVV 內的線性相依子集 L.D. => 反之,SSS 則稱為VVV 內的線性獨立子集 L.I. #...
3.4k 3 分鐘

# 課堂練習 # d732: 二分搜尋法 給你一個嚴格遞增的數列,求數列中是否存在一個值與 X 相等? 若有,則輸出該值位置。否則,輸出 0。 因為測資很龐大,所以,不推薦使用線性搜O(n)O(n)O(n) 的方式。 又因為序列已經是嚴格遞增的,所以,可以使用二分搜O(log2n)O(log_2n)O(log2​n) 的方式進行搜索。 #include <iostream>using namespace std;int main(){ int n,k,x,a[100005]; while(cin >> n >>...
3k 3 分鐘

# 上課例題 # b966: 第 3 題 線段覆蓋長度 給定一維座標上一些線段,求這些線段所覆蓋的長度,注意,重疊的部分只能算一次。 將每一條線段的起始點做排序,將起始位置設為第一條線段的頭,將結尾位置設為第一條線段的尾,再開始往後依序判別, 若現在的結尾位置已經超越了下一線段的頭,則將結尾位置定在下一個線段的尾 若現在的結尾位置未與下一線段的頭重疊,則使 cnt 加上目前累積的長度 (結尾位置 - 起始位置) #include <bits/stdc++.h>using namespace std;typedef struct _node...
4.8k 4 分鐘

像是在排隊結帳一樣,最先開始排隊的人,可以最先離開隊列完成結帳 # 基本用法 名稱 意義 queue<int> q 建立一個 int 型別的 queue q.size() 佇列元素數量 q.empty() 判斷佇列是否為空 q.push(x) 從佇列「前端」加入一個元素 x q.pop() 刪除佇列前端元素 q.front() 取得佇列前端元素 q.back() 取得後端元素 刪除 q.front() 並不會刪除前端元素 # 上課例題 # e155: 10935 - Throwing cards away...
2.9k 3 分鐘

像是自助餐廳的餐盤架,最新補充的乾淨餐盤堆疊在上方,客人取用餐盤時,從最上方的開始拿。 # 基本用法 名稱 意義 stack<int> sk 建立一個 int 型別的 stack sk.size() 堆疊元素數量 sk.empty() 判斷堆疊是否為空 sk.push(x) 從堆疊「頂端」加入一個元素 x sk.pop() 刪除堆疊頂端元素 sk.top() 取得堆疊頂端元素 刪除 sk.top() 並不會刪除頂端元素 # 上課例題 # a034: 二進位制轉換 將一個 10 進位的數字換成二進位數字 每一次就對 n...