LeetCode 410: Split Array Largest Sum 解题与思考

LeetCode 410: Split Array Largest Sum 解题与思考

[原题链接]

题目描述

给定一个数列{ an },以及集数m,要求在不改变{ an }中元素先后顺序的前提下,将其分成m个子集,每个子集中的数字求和,题目寻找一个分法,使得所有和中的最大值最小。

思路

万事万物皆可DP,真的

一开始想的就是将这个问题分解为两个子数列,其中一个作为一个集合,另外一边则变为求某个数列分成m-1个集合的子问题。
显然子问题有着最优子结构。

不妨假设 Rm1,n1 为以 a0 开头, an1 结尾的一个数列分成m个子集所能得到的最大和的最小值,那么有递推式

Rm1,n1=min(maxi=0...(n2)(Rm2,i,k=i+1n1ak))

而当m = 1时,有 R0,n1=n1k=0ak

算法

声明二维数组array[m][n]
1、初始化 array[0][q]=qk=0ak
2、循环计算 array[p][q]=min(max(array[p1][i]+qk=i+1ak)),(i=0,1,...q1)
3、 array[m1][n1] 则为所求

代码

#include <iostream>
#include <stdlib.h>
#include <vector>
using namespace std;

class Solution {
public:
    int splitArray(vector<int>& nums, int m) {
        int size = nums.size();
        long long *arr = (long long*)malloc(sizeof(long long) * m * size);
        long long sum = 0;

        for ( int i = 0; i < size; i++ ) {
            sum += nums[i];
            arr[i] = sum;
        }

        for ( int i = 1; i < m; i++ ) {
            for ( int j = size - 1; j >= i; j-- ) {
                sum = 0;
                arr[i * size + j] = 2147483999;
                for ( int k = j; k >= i; k-- ) {
                    sum += nums[k];
                    long long temp = (sum < arr[(i - 1) * size + k - 1]) ? arr[(i - 1) * size + k - 1] : sum;
                    if ( arr[i * size + j] > temp ) arr[i * size + j] = temp;
                }
            }
        }

        int result = arr[size * m - 1];
        free(arr);
        return result;
    }
};

思考

有个坑爹的测例:
{1, 2147483647}, m = 2
所有变量被逼无奈从int换成long long,其它的就没什么难的了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值