zoukankan      html  css  js  c++  java
  • LeetCode 410. Split Array Largest Sum

    原题链接在这里:https://leetcode.com/problems/split-array-largest-sum/

    题目:

    Given an array which consists of non-negative integers and an integer m, you can split the array into m non-empty continuous subarrays. Write an algorithm to minimize the largest sum among these m 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 = 2
    
    Output:
    18
    
    Explanation:
    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.

    题解:

    Let dp[i][j] denotes up to index j, with i cut, the minimum of largest sum of subarrays.

    Thus with i = 0, that means there is no cut. Initialize dp[0][j] as sum of nums[0] to nums[j].

    For dp[i][j], we could cut at (0, 1, .... j -1). And minimize Math.max(dp[i - 1][k], dp[0][j] - dp[0][k]).

    Note: update part, i starts from 1, becasue we need dp[i - 1][k].

    Time Complexity: O(m * n ^ 2). n = nums.length.

    Space: O(m * n).

    AC Java:

     1 class Solution {
     2     public int splitArray(int[] nums, int m) {
     3         if(nums == null || nums.length == 0){
     4             return 0;
     5         }
     6         
     7         int n = nums.length;
     8         int [][] dp = new int[m][n];
     9         dp[0][0] = nums[0];
    10         for(int j = 1; j < n; j++){
    11             dp[0][j] = dp[0][j - 1] + nums[j]; 
    12         }
    13         
    14         for(int i = 1; i < m; i++){
    15             for(int j = i; j < n; j++){
    16                 int min = Integer.MAX_VALUE;
    17                 for(int k = 0; k < j; k ++){
    18                     min = Math.min(min, Math.max(dp[i - 1][k], dp[0][j] - dp[0][k]));
    19                 }
    20                 
    21                 dp[i][j] = min;
    22             }
    23         }
    24         
    25         return dp[m - 1][n - 1];
    26     }
    27 }
  • 相关阅读:
    Gist
    Gist
    Gist
    汉字编码与其16进制对照
    Horizon组件安装详解
    Github目录生成器
    MVC模式网站编写经验总结
    Java多线程小结
    JGit与远程仓库链接使用的两种验证方式(ssh和https)
    Peterson算法与Dekker算法解析
  • 原文地址:https://www.cnblogs.com/Dylan-Java-NYC/p/12200572.html
Copyright © 2011-2022 走看看