LeetCode 最大平均值和的分組(動態規劃)

2021-09-23 01:38:54 字數 1600 閱讀 4056

我們將給定的陣列 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...