Educational DP Contest
A - Frog 1
你有 N 個平台。平台編號為 1, 2, …, N。對於每個 i (1 ≤ i ≤ N),平台 i 的高度是 h_i。
最初,一隻青蛙在平台 1 上。
青蛙重複以下動作,試圖到達平台 N:
- 當青蛙在平台 i 上時,它跳到平台 i + 1 或 i + 2。
- 當跳到平台 j 時,它支付成本 |h_i - h_j|。
求青蛙到達平台 N 所需支付的最小總成本。
n = int(input())
h = list(map(int, input().split()))
dp = [0] * n
dp[1] = abs(h[1] - h[0])
for i in range(2, n):
dp[i] = min(dp[i-1] + abs(h[i] - h[i-1]), dp[i-2] + abs(h[i] - h[i-2]))
print(dp[-1])
B - Frog 2
有 N 個立足點。立足點的編號是 1, 2, …, N。對每個 i (1 ≤ i ≤ N),立足點 i 的高度是 h_i。
最初,青蛙在立足點 1。青蛙重複以下行動若干次,試圖到達立足點 N。當青蛙在立足點 i 時,可以跳到立足點 i + 1, i + 2, …, i + K 中的任意一個。此時,如果跳到的立足點是 j,則需要支付成本 |h_i - h_j|。
求青蛙到達立足點 N 之前需要支付的總成本的最小值。
n, k = map(int, input().split())
h = list(map(int, input().split()))
dp = [0] * n
for i in range(1, n):
dp[i] = min(dp[i-j] + abs(h[i] - h[i-j]) for j in range(1, min(i+1, k+1)))
print(dp[-1])
C - Vacation
明日太郎君的暑假就要開始了。
太郎君決定要規劃他的暑假。暑假總共有 N 天。
對每一個 i (1 ≤ i ≤ N),在第 i 天,太郎君可以選擇以下其中一項活動:
- A:去海邊游泳。獲得幸福度 a_i。
- B:去山上抓蟲。獲得幸福度 b_i。
- C:在家裡寫作業。獲得幸福度 c_i。
太郎君很容易感到厭倦,所以他不能連續兩天或更多天做相同的活動。
請找出太郎君能獲得的最大總幸福度。
D - Knapsack 1
有 N 個物品。物品編號為 1, 2, …, N。 對於每個 i (1 ≤ i ≤ N),物品 i 的重量為 wᵢ,價值為 vᵢ。 太郎君要從 N 個物品中選擇一些,放入背包帶走。 背包的容量為 W,帶走的物品的重量總和必須 ≤ W。 請找出太郎君帶走的物品的價值總和的最大值。
限制:
- 所有輸入皆為整數。
- 1 ≤ N ≤ 100
- 1 ≤ W ≤ 10⁵
- 1 ≤ wᵢ ≤ W
- 1 ≤ vᵢ ≤ 10⁹
E - Knapsack 2
限制:
- 所有輸入都是整數。
- 1 ≤ N ≤ 100
- 1 ≤ W ≤ 10⁹
- 1 ≤ wᵢ ≤ W
- 1 ≤ vᵢ ≤ 10³
F - LCS
給定字串 s 和 t。請找出 s 的子序列,同時也是 t 的子序列的最長字串之一。
註解
字串 x 的子序列是指從 x 中移除 0 個或更多字元後,將剩餘字元按原始順序連接起來所形成的字串。
限制
- s 和 t 都是由小寫英文字母組成的字串。
- 1 ≤ |s|, |t| ≤ 3000
G - Longest Path
問題:
給定一個有向圖G,包含N個頂點和M條邊。頂點的編號為1, 2, …, N。對於每個 i (1 ≤ i ≤ M),第 i 條有向邊從頂點 x_i 指向頂點 y_i。圖G不包含有向環。
求G中,最長有向路徑的長度。
有向路徑的長度定義為路徑中包含的邊的數量。
限制:
- 所有輸入皆為整數。
- 2 ≤ N ≤ 10^5
- 1 ≤ M ≤ 10^5
- 1 ≤ x_i, y_i ≤ N
- 所有的 (x_i, y_i) 對都是不同的。
- 圖G不包含有向環。
H - Grid 1
給定一個 H 行 W 列的網格。 用 (i, j) 表示從上到下第 i 行,從左到右第 j 列的方格。 對於每個 i, j (1 ≤ i ≤ H, 1 ≤ j ≤ W),方格 (i, j) 的資訊由字元 a_{i, j} 給出。如果 a_{i, j} 是 .,則方格 (i, j) 是空方格;如果 a_{i, j} 是 #,則方格 (i, j) 是牆方格。 保證方格 (1, 1) 和 (H, W) 是空方格。
太郎君從方格 (1, 1) 出發,通過重複向右或向下移動到相鄰的空方格,來嘗試到達方格 (H, W)。 從方格 (1, 1) 到 (H, W) 的太郎君的路徑有多少種? 由於答案可能非常大,請計算對 10^9 + 7 取模的結果。
條件:
- H 和 W 是整數。
- 2 ≤ H, W ≤ 1000
- a_{i, j} 是 . 或 #。
- 方格 (1, 1) 和 (H, W) 是空方格。
I - Coins
題目敘述
給定一個正奇數 N。有 N 枚硬幣,編號為 1, 2, …, N。對於每個 i (1 ≤ i ≤ N),當你拋擲硬幣 i 時,正面朝上的機率是 pᵢ,反面朝上的機率是 1 - pᵢ。太郎將所有 N 枚硬幣都拋擲了。請求出正面朝上的硬幣數量多於反面朝上的硬幣數量的機率。
條件
- N 是一個奇數。
- 1 ≤ N ≤ 2999
- pᵢ 是一個實數,最多有兩位小數。
- 0 < pᵢ < 1
J - Sushi
你有 N 個盤子。盤子上分別標記著 1, 2, …, N。 最初,對於每個 i (1 ≤ i ≤ N),盤子 i 上有 aᵢ (1 ≤ aᵢ ≤ 3) 個壽司。 直到所有壽司都被吃光,太郎都會重複進行以下操作:
- 擲一個骰子,骰子的每個面出現的概率相等,骰子的點數為 1, 2, …, N。
- 假設骰子的點數為 i。如果盤子 i 上有壽司,則吃掉盤子 i 上的一個壽司。
- 如果盤子 i 上沒有壽司,則什麼也不做。
請求出所有壽司都被吃光之前,操作次數的期望值。
K - Stones
給定一個由 N 個正整數組成的集合 A = { a₁,a₂,…,aN }。
太郎君和次郎君玩一個遊戲。
首先,準備一堆由 K 個石頭組成的石堆。
兩人輪流進行以下操作。
先手是太郎君。從集合 A 中選擇一個元素 x,從石堆中恰好拿走 x 個石頭。
無法再進行操作的人輸。
假設兩人都採取最佳策略,判斷誰會獲勝。
L - Deque
太郎君和次郎君進行一個遊戲。
最初,給定一個數列 a = (a₁,a₂,…,aₙ)。 太郎君和次郎君輪流進行操作,直到數列 a 變為空。
每次操作,玩家可以從數列 a 的開頭或結尾移除一個元素。 移除的元素值為 x,進行操作的玩家得到 x 分。
遊戲結束時,太郎君的總得分為 X,次郎君的總得分為 Y。
太郎君的目標是最大化 X - Y,而次郎君的目標是最小化 X - Y。
假設兩人都採取最佳策略,請求出 X - Y 的值。
條件
- 所有輸入皆為整數。
- 1 ≤ N ≤ 3000
- 1 ≤ aᵢ ≤ 10⁹
M - Candies
有 N 個孩子。孩子的編號是 1, 2, …, N。他們要分 K 個糖果。
對於每個 i (1 ≤ i ≤ N),孩子 i 得到的糖果數量必須是 0 以上且不超過 aᵢ。
而且,糖果不能剩下。
有多少種孩子們分配糖果的方法?答案對 10⁹ + 7 取模。
如果存在一個孩子,他/她得到的糖果數量不同,則認為兩種方法是不同的。
限制
所有輸入都是整數。
1 ≤ N ≤ 100
0 ≤ K ≤ 10⁵
0 ≤ aᵢ ≤ K
N - Slimes
有 N 隻史萊姆排成一列。 最初,從左邊數起的第 i 隻史萊姆的大小是 a_i。 太郎想把所有史萊姆合併成一隻。 在史萊姆變成一隻之前,太郎會重複以下操作:
選擇左右相鄰的兩隻史萊姆,將它們合併成一隻新的史萊姆。 當合併前兩隻史萊姆的大小分別為 x 和 y 時,合併後史萊姆的大小為 x + y。 此時,太郎需要支付 x + y 的成本。 史萊姆的位置關係在合併前後保持不變。
請找出太郎需要支付的成本總和的最小值。
限制:
所有輸入都是整數。 2 ≤ N ≤ 400 1 ≤ a_i ≤ 10^9
O - Matching
有 N 個男性和 N 個女性。男性編號為 1, 2, …, N,女性也編號為 1, 2, …, N。對於每對 i, j (1 ≤ i, j ≤ N),用一個整數 a_{i, j} 來表示男性 i 和女性 j 的匹配程度。如果 a_{i, j} = 1,表示男性 i 和女性 j 相性良好,如果 a_{i, j} = 0,表示相性不好。
太郎君希望找到所有相性良好的男女配對,使得形成 N 對。
條件:
- 每個男性和每個女性都必須恰好屬於一個配對。
- 你需要計算有多少種不同的方式可以形成 N 對配對。
- 答案對 10^9 + 7 取模。
- 1 ≤ N ≤ 21
- a_{i, j} 的值只能是 0 或 1。
P - Independent Set
問題:
給定一個有 N 個頂點的樹。 頂點編號為 1, 2, …, N。 對於每個 i (1 ≤ i ≤ N - 1),第 i 條邊連接頂點 xi 和 yi。 太郎君決定將每個頂點塗成白色或黑色。 但是,相鄰的頂點不能同時塗成黑色。 請問頂點的顏色組合有多少種? 請對 10^9 + 7 取餘數。
條件:
- 所有輸入都是整數。
- 1 ≤ N ≤ 10^5
- 1 ≤ xi, yi ≤ N
- 給定的圖是一個樹。
Q - Flowers
有 N 朵花排成一列。
對於每個 i (1 ≤ i ≤ N),從左邊數來的第 i 朵花的高度是 h_i,美麗值是 a_i。
此外,h_1, h_2, …, h_N 彼此互不相同。
太郎想移除一些花,使得以下條件成立:
- 剩餘的花從左到右看,高度是單調遞增的。
請求出剩餘的花的美麗值總和的最大值。
限制
- 所有的輸入都是整數。
- 1 ≤ N ≤ 2 × 10^5
- 1 ≤ h_i ≤ N
- h_1, h_2, …, h_N 彼此互不相同。
- 1 ≤ a_i ≤ 10^9
R - Walk
給定一個有 N 個頂點的簡單有向圖 G。 頂點編號為 1, 2, …, N。 對於每個 i, j (1 ≤ i, j ≤ N),由整數 a_{i, j} 給出從頂點 i 到 j 的有向邊是否存在。 如果 a_{i, j} = 1,則存在從頂點 i 到 j 的有向邊;如果 a_{i, j} = 0,則不存在。
請問 G 中有多少個長度為 K 的有向路徑? 求出答案模 10^9 + 7 的結果。
允許有向路徑多次經過相同的邊。
限制:
輸入的所有值都是整數。 1 ≤ N ≤ 50 1 ≤ K ≤ 10^{18} a_{i, j} 是 0 或 1。 a_{i, i} = 0
S - Digit Sum
給定一個正整數 K 和一個正整數 D。請問有多少個介於 1 到 K 之間(包含 1 和 K)的整數,其十進位表示中所有數字的總和是 D 的倍數? 答案對 10^9 + 7 取模。
限制
- 所有輸入都是整數。
- 1 ≤ K < 10^10000
- 1 ≤ D ≤ 100
T - Permutation
給定一個正整數 N。
給定一個長度為 N - 1 的字符串 s,由 “<” 和 “>” 組成。
尋找有多少個 (1, 2, …, N) 的排列 (p_1, p_2, …, p_N) 滿足以下條件? 輸出答案模 10^9 + 7 的結果。
對於每個 i (1 ≤ i ≤ N - 1),如果 s 的第 i 個字符是 “<",則 p_i < p_{i + 1};如果 s 的第 i 個字符是 “>",則 p_i > p_{i + 1}。
約束
- N 是一個整數。
- 2 ≤ N ≤ 3000
- s 是一個長度為 N - 1 的字符串。
- s 僅由 “<” 和 “>” 組成。
U - Grouping
有 N 隻兔子。
兔子們的編號是 1, 2, …, N。
對於每對 i, j (1 ≤ i, j ≤ N),兔子 i 和 j 的相容性由整數 a_{i, j} 給定。
對於每個 i (1 ≤ i ≤ N) , a_{i, i} = 0,並且對於每個 i, j (1 ≤ i, j ≤ N), a_{i, j} = a_{j, i}。
太郎君想將這 N 隻兔子分成幾個群組。
此時,每隻兔子必須恰好屬於一個群組。
作為分組的結果,對於每對 i, j (1 ≤ i < j ≤ N),如果兔子 i 和 j 屬於同一個群組,太郎君會得到 a_{i, j} 分。
求太郎君總得分的最大值。
限制
所有輸入都是整數。 1 ≤ N ≤ 16 |a_{i, j}| ≤ 10^9 a_{i, i} = 0 a_{i, j} = a_{j, i}
V - Subtree
題目描述
給定一個有 N 個節點的樹。 節點編號從 1 到 N。 對於每個 i ( 1 ≤ i ≤ N - 1 ),第 i 條邊連接節點 x_i 和 y_i。 太郎決定將每個節點塗成白色或黑色。 在這個情況下,所有黑色的節點之間,都能只通過黑色的節點到達彼此。 給定正整數 M。 對於每個 v ( 1 ≤ v ≤ N ),回答以下問題: 有多少種節點塗色的方法,使得節點 v 是黑色的? 輸出結果對 M 取模。
條件
- 所有輸入都是整數。
- 1 ≤ N ≤ 10^5
- 2 ≤ M ≤ 10^9
- 1 ≤ x_i, y_i ≤ N
- 給定的圖是一個樹。
W - Intervals
考慮一個長度為 N 的由 0 和 1 構成的字符串。
這個字符串的得分計算如下: 對於每個 i (1 ≤ i ≤ M),如果從第 l_i 個字符到第 r_i 個字符之間至少包含一個 1,則將 a_i 加到得分中。 求字符串的最高得分。
限制: 所有輸入都是整數。 1 ≤ N ≤ 2 × 10^5 1 ≤ M ≤ 2 × 10^5 1 ≤ l_i ≤ r_i ≤ N |a_i| ≤ 10^9
X - Tower
你有 N 個積木。 每個積木都有一個編號 1, 2, …, N。 對於每個 i (1 ≤ i ≤ N),積木 i 的重量是 wi,堅固度是 si,價值是 vi。 太郎打算從 N 個積木中選擇一些,將它們以任意順序堆疊成塔。 這個塔必須滿足以下條件:對於塔中的每個積木 i,堆疊在積木 i 上的積木的總重量必須小於或等於 si。
找出塔中積木的價值總和的最大值。
條件
- 所有輸入都是整數。
- 1 ≤ N ≤ 10^3
- 1 ≤ wi, si ≤ 10^4
- 1 ≤ vi ≤ 10^9
Y - Grid 2
有一個 H 行、W 列的網格。
我們用 (i, j) 表示網格中從上數第 i 行、從左數第 j 列的格子。
網格中有 N 個格子 (r₁ , c₁), (r₂ , c₂), …, (rₙ , cₙ) 是牆壁格子,其餘的格子都是空的。
保證格子 (1, 1) 和 (H, W) 是空的。
太郎君從格子 (1, 1) 出發,重複向右或向下移動到相鄰的空格子,試圖到達格子 (H, W)。
從格子 (1, 1) 到 (H, W) 太郎君的路徑有多少種? 求出模 10⁹ + 7 的餘數。
條件
- 所有輸入都是整數。
- 2 ≤ H, W ≤ 10⁵
- 1 ≤ N ≤ 3000
- 1 ≤ rᵢ ≤ H
- 1 ≤ cᵢ ≤ W
- 格子 (rᵢ, cᵢ) 都彼此不同。
- 格子 (1, 1) 和 (H, W) 是空的。
Z - Frog 3
有 N 個平台。 平台編號為 1, 2, …, N。 對於每個 i (1 ≤ i ≤ N),平台 i 的高度為 h_i。 這裡, h_1 < h_2 < … < h_N。 最初,青蛙在平台 1 上。 青蛙重複以下行動若干次,試圖到達平台 N。 當青蛙在平台 i 上時,它跳到平台 i + 1, i + 2, …, N 中的任何一個。 此時,如果跳到的平台是 j,則需要支付成本 (h_j - h_i)^2 + C。 求青蛙到達平台 N 之前需要支付的成本總和的最小值。
條件:
- 所有輸入均為整數。
- 2 ≤ N ≤ 2 × 10^5
- 1 ≤ C ≤ 10^{12}
- 1 ≤ h_1 < h_2 < … < h_N ≤ 10^6