813. Largest Sum of Averages
題目網址:https://leetcode.cn/problems/largest-sum-of-averages/
題意:給一 array
nums和一整數k, 將nums分成最多k個相鄰的非空 subarray。分數為每個 subarray 內的平均值之總和。注意:必須使用
nums中的每一個數進行分組, 且分數不一定是整數。返回所能得到的最大分數, 答案誤差在 $10^{-6}$ 內都會被視為是正確的。

Solution:
想法:利用 DP
1. 定義狀態:
- 首先, 會在
nums前先加上一個0, 代表什麼元素都沒有的狀態dp[i][k]:nums[1:i]分成k個 group 的平均值之最大總和2. 得到轉移方程:
dp[i][k] = max(dp[i][k], dp[j - 1][k - 1] + sum / (i - j + 1));, 其中1 ≤ j ≤ i- 最後一個元素
nums[i], 必定是在當前最後一個連續 subarray 中, 因此要考慮這個區間的起始元素j會在哪裡 ➔ 故從i往前倒推3. 初始化:
dp[0][0]:空 array 分成0個 group 之最大平均值之總和為0
➔dp[0][0] = 0dp[i][0]:非空 array 不可能分成0個 group, 故用INT_MIN / 2代表不可能。由於題目要求最大值, 故初始值要設小, 但設INT_MIN後續計算會 overflow, 故設INT_MIN / 2
➔dp[i][0] = INT_MIN / 2, 其中1 ≤ i ≤ ndp[0][k]:空 array 不可能分成k個 group, 故用INT_MIN / 2代表不可能
➔dp[0][k] = INT_MIN / 2, 其中1 ≤ k ≤ k_
class Solution { |
- time:$O(n^2 \cdot k)$ ➔ for loop 中
i、k、j所需的時間分別為 $O(n)$、$O(k)$、$O(n)$ - space:$O(n \cdot k)$ ➔
dp
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論