第一次写题
    二分法:

    1. class Solution {
    2. public:
    3. int splitArray(vector<int>& nums, int m) {
    4. if(nums.size() == m) return *max_element(nums.begin(), nums.end());
    5. int iSum = 0;
    6. for(auto x: nums)
    7. iSum += x;
    8. int l = *max_element(nums.begin(), nums.end()), r = iSum;
    9. while(l < r)
    10. {
    11. int mid = ((long long)l + (long long)r) >> 1;
    12. int iPart = 0;
    13. int iPartCnt = 1;
    14. for(int i = 0; i < nums.size(); i++)
    15. {
    16. if(iPart + nums[i] <= mid)
    17. {
    18. iPart += nums[i];
    19. }
    20. else
    21. {
    22. iPart = nums[i];
    23. iPartCnt++;
    24. }
    25. }
    26. // cout << l << ' ' << r << ' ' << mid << ' ' << iPartCnt << endl;
    27. if(iPartCnt <= m)//相当于说我每一个段都想让它小于等于mid(eg, iSum),它做到了,所以我的right可以减小
    28. {
    29. r = mid;
    30. }
    31. else{
    32. l = mid + 1;
    33. }
    34. }
    35. return r;
    36. }
    37. };

    dp:

    1. class Solution {
    2. public:
    3. int splitArray(vector<int>& nums, int m) {
    4. vector<vector<long long>> aDp = vector<vector<long long>>(nums.size() + 1, vector<long long>(m + 1, INT_MAX));
    5. vector<long long> aSub(nums.size() + 1, 0);
    6. for(int i = 0; i < nums.size(); i++)
    7. aSub[i + 1] = aSub[i] + nums[i];
    8. aDp[0][0] = 0;
    9. for(int i = 1; i <= nums.size() ; i++)
    10. {
    11. for(int j = 1; j <= m; j++)
    12. {
    13. for(int k = j - 1; k < i; k++)//nums的第几个数
    14. {
    15. aDp[i][j] = min(aDp[i][j], max(aDp[k][j - 1], aSub[i] - aSub[k]));//aDp[k][j - 1]前面 j - 1 part,j - 1 个数字
    16. }
    17. }
    18. }
    19. return aDp[nums.size()][m];
    20. }
    21. };

    dfs 超时:

    class Solution {
        vector<long long> aPart;
        vector<int> aCnt;
        vector<int> nums;
        long long iRes = INT_MAX;
    
        void dfs(int idx, int ipart)
        {
            if(idx == nums.size())
            {
                if(*min_element(aCnt.begin(), aCnt.end()) == 0) return;
                // cout << aPart[0] << ' ' << aPart[1] << endl;
                iRes = min(iRes, *max_element(aPart.begin(), aPart.end()));
                return;
            }
            if(ipart >= aPart.size()) return;
                aPart[ipart] += nums[idx];
                aCnt[ipart] ++;
                dfs(idx + 1, ipart);
                dfs(idx + 1, ipart + 1);
                aPart[ipart] -= nums[idx];
                aCnt[ipart] --;
        }
    public:
        int splitArray(vector<int>& _nums, int m) {
            nums = _nums;
            if(nums.size() == 0) return 0;
            long long sum = 0;
            for(int i = 0; i < nums.size(); i++)
                sum += nums[i];
            if(m == 1) return sum;
            aPart = vector<long long>(m, 0);
            aCnt = vector<int>(m, 0);
            dfs(0, 0);
            return iRes;
    
        }
    };
    

    第二次写题

    class Solution {
    public:
        int splitArray(vector<int>& nums, int m) {
            if(m == nums.size()) return *max_element(nums.begin(),nums.end());
            // vector<vector<int>> aDp(nums.size() + 1, vector<int>(m + 1, INT_MIN));
            long long iSum = 0;
            for(auto x: nums) iSum += x;
            if(m == 1) return iSum;
            long long l = *max_element(nums.begin(), nums.end()), r = iSum;
            while(l < r)
            {
                long long mid = ((long long)l + (long long)r) >> 1;
                long long iPart = 0;
                int iCnt = 1;
                for(auto x: nums)
                {
                    if(iPart + x <= mid)
                    {
                        iPart += x;
                    }
                    else
                    {
                        iPart = x;
                        iCnt++;
                    }
                }
                if(iCnt <= m) r = mid;
                else l = mid + 1;
            }
            return r;
    
        }
    };
    

    dp:

    class Solution {
    public:
        int splitArray(vector<int>& nums, int m) {
            vector<vector<long long>> aDp(nums.size() + 1, vector<long long>(m + 1, INT_MAX));
            aDp[0][0] = 0;
            vector<long long> aSub(nums.size() + 1);
            for(int i = 1; i <= nums.size(); i++)
            {
                aSub[i] = aSub[i - 1] + nums[i - 1];
            }
            for(int i = 1; i <= nums.size(); i++)
            {
                for(int j = 1; j <= m; j++)
                {
                    for(int k = j - 1; k < i; k++)
                        aDp[i][j] = min(aDp[i][j], max(aDp[k][j - 1], aSub[i] - aSub[k]));
                }
            }
            return aDp[nums.size()][m];
        }
    };
    

    dfs

    class Solution {
        vector<long long> aPartSum;
        vector<int> aPartCnt;
        long long iRes = INT_MAX;
        int m;
        vector<int> nums;
        void dfs(int idx, int part)
        {
            if(part >= m) return;
            if(idx == nums.size())
            {
                if(*min_element(aPartCnt.begin(), aPartCnt.end()) == 0)
                    return;
                else
                {
                    iRes = min(iRes, *max_element(aPartSum.begin(), aPartSum.end()));
                    return;
                }
            }
            aPartSum[part] += nums[idx];
            aPartCnt[part] += 1;
            dfs(idx + 1, part);
            dfs(idx + 1, part + 1);
            aPartSum[part] -= nums[idx];
            aPartCnt[part] -= 1;
    
        }
    public:
        int splitArray(vector<int>& _nums, int _m) {
            m = _m;
            nums = _nums;
            aPartSum = vector<long long>(m, 0);
            aPartCnt = vector<int>(m, 0);
    
            dfs(0, 0);
            return iRes;
        }
    };