努橙刷题编

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

https://leetcode.com/problems/split-array-largest-sum/#/description

state(状态):dp[i][j] - 在 nums 中,选出前 i 个元素,分成 j 份时,在这 j 个 subarray 的 sum 中最大的 sum

function(递推公式):dp[i][j] = Min(x){ Max(dp[x][j - 1], sum[i] - sum[x])}, 0 <= x < i

initialize(初始化): dp[0][0] = 0; dp[i][j] = Integer.MAX_VALUE

answer: dp[nums.length][m]

public class Solution {
    public int splitArray(int[] nums, int m) {
        int[] sum = new int[nums.length + 1];
        int[][] dp = new int[nums.length + 1][m + 1];
        sum[0] = 0;
        for (int i = 0; i < nums.length; i++) {
            sum[i + 1] = sum[i] + nums[i];
        }
        for (int i = 0; i <= nums.length; i++) {
            for (int j = 0; j <= m; j++) {
                dp[i][j] = Integer.MAX_VALUE;
            }
        }
        dp[0][0] = 0;
        for (int i = 1; i <= nums.length; i++) {
            for (int j = 1; j <= m; j++) {
                for (int x = 0; x < i; x++) {
                    int value = Math.max(dp[x][j - 1], sum[i] - sum[x]);
                    dp[i][j] = Math.min(dp[i][j], value);
                }
            }
        }
        return dp[nums.length][m];
    }
}

 

这个方法应该还有简化的可能。。。

 

posted on 2017-05-16 11:12  努橙  阅读(120)  评论(0编辑  收藏  举报