建國中學 賴昭勳
#68610
從一個有6顆不同的球的袋子中任意取3顆球,有幾種取法?
當一個問題可以被分成很多個問題合併起來的時候(遞迴關係),則可以將小問題的結果存起來,去往後推大問題的答案。
遞迴表示方法?
f(1) = 1, f(2) = 1
f(n) = f(n - 1) + f(n - 2)
int fib(int n) {
if (n == 1 || n == 2) return 1;
else return fib(n - 1) + fib(n - 2);
}
感覺有點沒效率?
int f[1000];
int fib(int n) {
f[1] = f[2] = 1;
for (int i = 3;i <= n;i++) {
f[i] = f[i - 1] + f[i - 2];
}
return f[n];
}
當問到的數字已經被算過了,就直接拿來用。
時間複雜度:線性 O(n)
有個 n=8 階的樓梯,每次可以往上走1, 2, 3階,共有幾種走完8階的方法?
可在slido 回答!
int dp[n + 1];
dp[0] = 0, dp[1] = 1, dp[2] = 2;
for (int i = 3;i <= n;i++) {
dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
}
例如:https://tioj.ck.tp.edu.tw/problems/1354
題:有一隻青蛙在A, B, C, D四個石頭之間跳。青蛙從A開始,每次跳到不同的石頭,問跳n次之後停在A的方法有幾種?
ex. N = 5
有 n=10 個排成一排的座位。
定義一種坐法是「尷尬」為:原本坐的人兩兩不相鄰,但是再加一個人就一定會出現相鄰的狀況。
有幾種「尷尬」的坐的方法?
定義:dp[i][0] 代表長度為 i 且最後一項是空的時候有幾種方法。dp[i][1] 代表長度為 i 且最後一項有坐人的方法數。
轉移:考慮以下情況。
因此可以得到:
dp[i][0] = dp[i - 1][1]
dp[i][1] = dp[i - 2][1] + dp[i - 3][1]
i = | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
dp[i][0] | 0 | 1 | 1 | 1 | 2 | 2 | 3 | 4 | 5 |
dp[i][1] | 1 | 1 | 1 | 2 | 2 | 3 | 4 | 5 | 7 |
從A到B,只往右或往上,有幾種走法?
ex. n = 3, m = 5
若 j < i (球數小於箱子數),dp[i][j] = 0
否則,有兩種方法達到dp[i][j]:
從dp[i - 1][j - 1] 多一個箱子跟球,球在那個新的箱子裡。
從dp[i][j - 1] 中加一個球進去,有 i 個位置可以加。
因此:dp[i][j] = dp[i - 1][j - 1] + i * dp[i][j - 1]
i\j | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 1 |
2 | 0 | 1 | 3 | 7 | 15 |
3 | 0 | 0 | 1 | 6 | 25 |
有一個2xn 的表格,現在要將1~2n放進去,必須符合:左邊格子<右邊格子且
上面格子<下面格子。 有幾種方法?
ex: n = 4
註:這題討論的是O(n^2)的解
1 | 2 | 5 |
---|---|---|
3 | 4 | 6 |
1 | 3 | 4 |
---|---|---|
2 | 5 | 6 |
2 | 3 | 4 |
---|---|---|
1 | 5 | 6 |
假設我們已經知道一個橫排要選哪些數
(ex. 1 3 4 5), 那麼那些數只有一種排法!
此問題等價於:將1~2n的數字標示 n 個 A 和n 個B,代表那個數字要寫在上面還是下面。則有幾種作法讓任一前綴中 A的個數>=B的個數?
AAABBB, ABAABB (O)
AABBBB, ABBABB (X)
這樣的話,答案就是 dp[n][0]
j\i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|
8 | 1 | |||||||
7 | 1 | |||||||
6 | 1 | 7 | ||||||
5 | 1 | 6 | ||||||
4 | 1 | 5 | 20 | |||||
3 | 1 | 4 | 14 | |||||
2 | 1 | 3 | 9 | 28 | ||||
1 | 1 | 2 | 5 | 14 | ||||
0 | 1 | 2 | 5 | 14 |
從很簡單到超級難的題目,
從APCS(第四題) 到 IOI,
DP無所不在。
卡特蘭數
錯排
如何計算C(n, k)...
H(n, k)