撰寫者 4Yu
C++ 基本架構
輸出
輸入輸出
變數
輸入輸出
變數
運算子
輸入輸出
變數
運算子
提示:
一打 12 支總價 = 幾打 * 一打價錢 + 剩下的 * 一支價錢
if-else 條件判斷式
進階解法:三元運算
多重條件判斷式
迴圈
迴圈
多重判斷式
迴圈
判斷式
陣列
迴圈
陣列
前綴和建置
迴圈
陣列
注意數字範圍可能會產生溢位(Overflow),變數型別要開 long long
前綴和應用
EOF 輸入
複雜度分析
建前綴和, 查詢
二維前綴和
巢狀迴圈
二維陣列
EOF 輸入
排容原理
或是可以直接加在原本陣列上,不用多開個 pre 浪費空間
STL 資料結構
queue 佇列
STL 資料結構
stack 堆疊
STL 資料結構
set 集合
STL 資料結構
set 集合
Range-based for loop
運用了 set 可以去除重複元素並排序的特性
最後用for(auto i : s)
遍歷全部元素並輸出
DP 動態規劃
定義 dp[i] = 走到第 i 階時的最大走法數
轉移式為 dp[i] = dp[i-1] + dp[i-2]
因為一次只能走 1 階或 2 階,所以第 i 階只能從第 i - 1 階和第 i - 2 階走過來
先推出每項的值,每當詢問時直接查詢就好
DP 動態規劃
定義 dp[i] = 用硬幣組合出 i 元的最大方法數
跟上一題差不多,只不過種類更多了,從 2 種(走 1 步或走 2 步)變成 5 種(5 種不同的幣值),所以我們再套一層迴圈去累計每種的方法數
DP 動態規劃
定義 dp[i][j] = 經過 j 次傳球後回到 i 手上的路徑數
將 dp[0][0] 初始化為 1,因為經過 0 次傳球後回到 0 手上的路徑數只有一個
將 dp[0][1 ~ n-1] 初始化為 0,因為不可能經過 0 次傳球後回到 1 ~ n-1 手上
每次只能往左邊或右邊傳球,所以轉移式為 dp[i][j] = dp[i-1][(j+1)%n] + dp[i-1][(j-1+n)%n];
要 % n 讓它可以循環
我們要求經過 m 次傳球回到 0 手上的路徑數,取 dp[m][0] 即為答案
stack 進階應用
括號匹配問題
getline 輸入
可以使用 stack 實作括號匹配問題,想法是維持 stack 內都只放入左括號,遇到右括號時,若與 stack 最上方的左括號匹配就 pop,否則就不是一個正確的運算式,例如:[)
無法匹配就不可能正確了。因為每對括號若匹配就會被 pop 掉,所以直到最後若 stack 為空,就是一個正確的運算式。
注意這題有空白行,所以要用 getline 輸入,雖然推廣課程沒教到,不過培訓課程會教,所以快報名吧!