Easy: 一開始計數器 $C$ 置0。你可以做兩種操作。操作A: $C := C + P_A$ ;操作B﹕ $C := C\times P_B$ 。你只可以使用兩種操作分別為 $N_A$ 和 $N_B$ 次,操作可按任意順序,問最大值可以是多少? 注意 $P_A$ 和 $P_B$ 皆可以是負數(不然你早就知道答案是 $C_{\max} = N_AP_AP_B^{N_B}$ )。
秒殺類動態規劃。設 $F_{\max}(i, j)$ 和 $F_{\min}(i, j)$ 為經過 $i$ 次操作A和 $j$ 次操作B之後得到的最大及最小值。除基本情況下狀態轉移方程則是
\[F_{\min}(i, j) = \min\{F_{\min}(i-1, j), F_{\max}(i-1, j), F_{\min}(i, j-1), F_{\max}(i, j-1)\}\times P_B\]
$O(N_AN_B)$ 的就是做。
另外,留意到我說全部都是正數的情況嗎?其實另有一個挺簡單的算法。
假設 $S_A = N_AP_A$ ,我們則只需取 $\max_{0 \le i \le N_B}\{S_A \times P_B^i\}$ 即可。
原因是很簡單的,我們可以真的不用乘 $P_B$ 剛好 $N_B$ 次,如果想乘剛好 $k$ 次的話,餘下的 $N_B-k$ 次則可以先在 $C = 0$ 的時候用 $N_B - k$ 次操作B抵銷掉。至於為何這種模式的操作次序為何保証答案最優,則可以考慮情況再作分析即可。
Medium: 一個 $N$ 個元素的數列 $A$ 是美麗的數列,若且僅若以下條件成立﹕
- $A_i \le \frac{\sum_{j=1}^{i-1}A_j}{i-1}, i > 1$
- 沒有連續三個元素使得 $A_{i-1} > A_i > A_{i+1}$
- $0 \le A_i \le 40$
給定的數列的能帶-1。現在問,如果為這些帶-1的元素取代成0至40之間的整數,問有多少個構成的數列是美麗的數列?答案取模 $10^9+7$ 。
又是動態規劃題。今次的狀態是這樣定義的﹕ $F(i, v, d, s)$ 。 $i$ 是指當前第幾個元素, $v$ 是指當前第 $i-1$ 個元素是甚麼, $d$ 是指 $v$ 是第幾個嚴格遞降元素, $s$ 是指 $s = \sum_{j=1}^{i-1}A_j$ 。那麼可以轉移的合法狀態是甚麼呢?設能轉移的合法狀態是 $F(i+1, v', d', s')$ 。則有
- $0 \le v' \le 40$
- $d' = \begin{cases} 0 & \text{ if } v' \ge v \\ d+1 & \text{ otherwise } \end{cases}$ 而且 $d' \ne 2$
- $s' = s + v'$
- $i\times v' \le s $
只要按這些參數枚舉,則可以把所有合法的 $F(i+1, v', d', s')$ 更新成 $F(i+1, v', d', s') := F(i+1, v', d', s') + F(i, v, d, s) $ 。最底層則是 $F(0, 0, 0, 0) = 1$ 。可以根據上述的條件限制一定的枚舉範圍避免超時。答案就是 $\sum_{v, d, s} F(N, v, d, s) \bmod{10^9+7}$ 。