410 分割陣列的最大值

2021-10-08 12:31:02 字數 1268 閱讀 2331

給定乙個非負整數陣列和乙個整數 m,你需要將這個陣列分成 m 個非空的連續子陣列。設計乙個演算法使得這 m 個子陣列各自和的最大值最小。

注意:

陣列長度 n 滿足以下條件:

示例:

輸入:

nums = [7,2,5,10,8]

m = 2

輸出:18

解釋:一共有四種方法將nums分割為2個子陣列。

其中最好的方式是將其分為[7,2,5] 和 [10,8],

因為此時這兩個子陣列各自的和的最大值為18,在所有情況中最小。

思路一:

動態規劃:令dp[i][j]為將前i個數分為j段得到的最小和。在進行狀態轉移時,我們可以考慮第 j 段的具體範圍,即我們可以列舉 k,其中前 k 個數被分割為 j−1 段,而第 k+1 到第 i 個數為第 j 段。

class

solution

int[

] sub =

newint

[n +1]

;for

(int i =

0; i < n; i++

) f[0]

[0]=

0;for(

int i =

1; i <= n; i++)}

}return f[n]

[m];

}}

思路二:對結果進行二分查詢,將當前的結果帶入陣列分段,確保每一段都不大於當前列舉值,如果需要的段數大於m則說明該值偏大,往前收縮,否則向後收縮。對於列舉邊界l應當為max(最大值陣列和sum/段數m+0.5),r = sum

public

intsplitarray

(int

nums,

int m)

l = math.

max(l,

(int

)(sum/m+

0.5));

r = sum;

while

(l < r)

sum += nums[i];}

//說明res小了

if(n > m)

else

}return l;

}

410 分割陣列的最大值

給定乙個非負整數陣列和乙個整數 m,你需要將這個陣列分成 m 個非空的連續子陣列。設計乙個演算法使得這 m 個子陣列各自和的最大值最小。令dp i j 表示陣列前i個數分成j段時的最小和,那麼我們可以列舉k,表示前k個數分成了j 1段,那麼後k 1到i個數就被分成了一段,此時狀態轉移方程就是 sub...

410 分割陣列的最大值

給定乙個非負整數陣列和乙個整數 m,你需要將這個陣列分成 m 個非空的連續子陣列。設計乙個演算法使得這 m 個子陣列各自和的最大值最小。注意 陣列長度 n 滿足以下條件 1 n 1000 1 m min 50,n 示例 輸入 nums 7,2,5,10,8 m 2 輸出 解釋 一共有四種方法將num...

410 分割陣列的最大值 C

給定乙個非負整數陣列和乙個整數 m,你需要將這個陣列分成 m 個非空的連續子陣列。設計乙個演算法使得這 m 個子陣列各自和的最大值最小。注意 陣列長度 n 滿足以下條件 1 n 1000 1 m min 50,n 示例 輸入 nums 7,2,5,10,8 m 2 輸出 18 解釋 一共有四種方法將...