[LeetCode] 410. Split Array Largest Sum

本文介绍了一种使用动态规划解决LeetCode上“分割数组最大和”问题的方法。通过定义状态dp[i][j]为在nums数组中,选出前i个元素并将其分为j份时,各子数组和中的最大值。文章给出了递推公式和初始化条件,并提供了一个Java实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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]; } }

 

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

 

转载于:https://www.cnblogs.com/chencode/p/split-array-largest-sum.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值