410 分割陣列的最大值

2021-10-08 12:20:38 字數 906 閱讀 7951

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

令dp[i][j]表示陣列前i個數分成j段時的最小和,那麼我們可以列舉k,表示前k個數分成了j-1段,那麼後k+1到i個數就被分成了一段,此時狀態轉移方程就是

sub(k+1, j)表示第k+1個數到第i個數的和,注意邊界條件當i>j時,dp[i][j]應該為乙個無窮大數,因為不能分空陣列,dp[0][0]=0。

class

solution

dp[0]

[0]=

0;for(

int i =

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

}return dp[n]

[m];}}

;

二分法成立條件,當陣列的m越大時,陣列各自和必定越小,m越小時,陣列和必定越大。

邊界條件為m=1時,陣列各自和就是陣列的全和,m=元素個數時,陣列各自和就是陣列的最大元素。

問題轉化為求解符合m條件時,陣列各自和最小。

其實這個問題等價於求解二分查詢數字的左邊界。

class

solution

sum +

= num;

}return cnt <= m;

}int

splitarray

(vector<

int>

& nums,

int m)

}//相當於二分求解滿足條件m時的左邊界

while

(left < right)

//當分割數目大於m時,說明陣列和過小,需要擴大

else

}return left;}}

;

410 分割陣列的最大值

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

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 解釋 一共有四種方法將...