410. 分割数组的最大值(动规、二分+贪心)

在这里插入图片描述

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;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_38662930/article/details/107574475
今日推荐