Split Array Largest Sum

来源:互联网 发布:我的世界强制附魔js 编辑:程序博客网 时间:2024/04/30 17:19

Split Array Largest Sum

Given an array which consists of non-negative integers and an integer m, you can split the array intom non-empty continuous subarrays. Write an algorithm to minimize the largest sum among thesem subarrays.

Note:
If n is the length of array, assume the following constraints are satisfied:

  • 1 ≤ n ≤ 1000
  • 1 ≤ m ≤ min(50, n)

Examples:

Input:nums = [7,2,5,10,8]m = 2Output:18Explanation:There are four ways to split nums into two subarrays.The best way is to split it into [7,2,5] and [10,8],where the largest sum among the two subarrays is only 18.
解析:

自己吭哧了半天,找到所有分成m份的结果求出所有的最小值,开始超时,对遍历前面的和大于后面的最大值时进行剪枝,a了,后来看大神的解答,大家都用二分法,特别巧妙,我怎么就想不出了呢,m=1时,结果就是所有值的和,m=n时,结果就是最大值,m为其他的值结果就在两个值之间,对这个值进行二分查找。

代码:

class Solution {public:    int splitArray(vector<int>& nums, int m) {        vector<vector<int>>vis(m+1,vector<int>(nums.size(),0));                return dfs(nums,m,0,vis);    }        int dfs (vector<int>&nums,int m,int begin,vector<vector<int>> &vis)    {        if (vis[m][begin])        return vis[m][begin];        int ans=0;        if (m==1)        {            for (int i=begin; i<nums.size(); i++)            {                ans+=nums[i];            }            vis[m][begin]=ans;            return ans;        }        if ((nums.size()-begin)==m)        {            vis[m][begin]=*max_element(nums.begin()+begin,nums.end());            return vis[m][begin];        }                ans=INT_MAX;        int i;        int tempsum=0;        int temp=0;        for ( i=begin+1; i<nums.size()-m+2; i++)        {             tempsum=0;            for (int j=begin; j<i; j++)            {                tempsum+=nums[j];            }                        if (vis[m-1][i])            {                temp=vis[m-1][i];            }            else            {                temp=dfs(nums,m-1,i,vis);                vis[m-1][i]=temp;            }            ans=min(ans,max(tempsum,temp));            if (tempsum>temp)            break;        }        return ans;                    }    };

class Solution {public:    int splitArray(vector<int>& nums, int m) {       long long left=0;       long long right=0;       for (int i=0; i<nums.size(); i++)       {           right+=nums[i];           left=max(left,(long long)nums[i]);       }       while(left<right)       {           int mid=(left+right)/2;           if (split(nums,m,mid)) right=mid;           else           left=mid+1;       }       return left;    }        bool split(vector<int>&nums,int cut,int mid)    {        int count=1;        long long sum=0;        for (int i=0; i<nums.size(); i++)        {            sum+=nums[i];            if (sum>mid)            {                count++;                if (count>cut)                return false;                sum=nums[i];            }        }        return true;    }}



0 0
原创粉丝点击