我們將給定的陣列 a 分成 k 個相鄰的非空子陣列 ,我們的分數由每個子陣列內的平均值的總和構成。計算我們所能得到的最大分數是多少。
注意我們必須使用 a 陣列中的每乙個數進行分組,並且分數不一定需要是整數。
示例:
輸入:
a = [9,1,2,3,9]
k = 3
輸出: 20
解釋:
a 的最優分組是[9], [1, 2, 3], [9]. 得到的分數是 9 + (1 + 2 + 3) / 3 + 9 = 20.
我們也可以把 a 分成[9, 1], [2], [3, 9].
這樣的分組得到的分數為 5 + 2 + 6 = 13, 但不是最大值.
說明:
1 <= a.length <= 100.
1 <= a[i] <= 10000.
1 <= k <= a.length.
答案誤差在 10^-6 內被視為是正確的。
思路分
析:\color思路分析:
思路分析
:對於這道題,剛開始我想著利用貪心策略來處理,蛋試發現問題遠沒有貪心策略那麼簡單。蛋試一般這種陣列分割求最大值都是用貪心策略、動態規劃,所以轉移到動態規劃。
在進行動態規劃求解之前,我們需要知道如何快速求和陣列某一段的和。請先翻閱 leetcode 區域和檢索
本題同樣採用這種策略快速計算陣列段的和。使用sum[i]記錄陣列a的前i個元素的和,所以陣列段[j, i)
的和 =sum[i] - sum[j]
接著就是動態陣列以及狀態轉移方程的構建。
dp[i][k]用於記錄a陣列前i個元素分成k段平均值和的最大值。
如果k == 1,dp[i][k] = sum[i] * 1.0 / i。代表著把前i個元素分成1段,平均值和的最大值就是自身的平均值
否則dp[i][k] = max(dp[i][k], dp[j][k - 1] + 1.0 * (sum[i] - sum[j]) / (i - j));//其中j∈[1, i),
//整個表示式代表把前個元素分成k段最大值 = max(把前j個分成k - 1段,最後[j, i)單獨看做一段計算的和)
class
solution
//dp[i][k]表示把a陣列中前i個元素分成k段,最大值
vector
double
>>
dp(asize +
1, vector<
double
>
(k +1,
0));
//第二步:開始動態規劃
for(
int i =
1; i <= asize;
++i)}}
return dp[asize]
[k];
//把陣列前asize個元素分成k段平均值和的最大值}}
LeetCode813 最大平均值和的分組
我們將給定的陣列 a 分成 k 個相鄰的非空子陣列 我們的分數由每個子陣列內的平均值的總和構成。計算我們所能得到的最大分數是多少。注意我們必須使用 a 陣列中的每乙個數進行分組,並且分數不一定需要是整數。示例 輸入 a 9,1,2,3,9 k 3 輸出 20 解釋 a 的最優分組是 9 1,2,3 ...
leetcode813 最大平均值和的分組
我們將給定的陣列 a 分成 k 個相鄰的非空子陣列 我們的分數由每個子陣列內的平均值的總和構成。計算我們所能得到的最大分數是多少。注意我們必須使用 a 陣列中的每乙個數進行分組,並且分數不一定需要是整數。示例 輸入 a 9,1,2,3,9 k 3 輸出 20 解釋 a 的最優分組是 9 1,2,3 ...
最大化平均值
有n個物品的重量和價值分別是w i 和v i 從中選出k個物品使得單位重量的價值最大。1 k n 10 4 1 w i v i 10 6 一般想到的是按單位價值對物品排序,然後貪心選取,但是這個方法是錯誤的,對於有樣例不滿足。我們一般用二分搜尋來做 其實這就是乙個01分數規劃 我們定義 條件 c x...