給定乙個非負整數陣列和乙個整數 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 解釋 一共有四種方法將...