class Solution {
public:
int splitArray(vector<int>& nums, int m) {
int n=nums.size();
// int dp[n+1][m+1]={00
vector<vector<long long >>dp(n+1,vector<long long >(m+1,0));
for(int i=1;i<=n;i++) dp[i][1]=dp[i-1][1]+nums[i-1];
for(int j=2;j<=m; j++){
for(int i=j;i<=n;i++){
dp[i][j]=INT_MAX;
for(int k=1;k<=i-j+1;k++){
int tmp=max(dp[i-k][j-1],dp[i][1]-dp[i-k][1]);
if(tmp>dp[i][j]) break;
dp[i][j]=tmp;
}
}
}
return dp[n][m];
}
};
class Solution {
public:
int check(vector<int>& nums, int mid){
int cnt=1;
long long sum=0;
for(int i=nums.size()-1;i>=0;i--){
sum+=(long long )nums[i];
if(sum>mid){
sum=(long long )nums[i];
cnt++;
}
}
return cnt;
}
int splitArray(vector<int>& nums, int m) {
long long l=0;
long long r=0;
for(int i=0;i<nums.size();i++){
r+=(long long )nums[i];
l=max((long long )nums[i],l);
}
while(l<r){
int mid=l+(r-l)/2;
if(check(nums,mid)>m){
l=mid+1;
}else
r=mid;
}
return l;
}
};
410. 分割数组的最大值(动规、二分+贪心)
猜你喜欢
转载自blog.csdn.net/qq_38662930/article/details/107574475
今日推荐
周排行