lintcode 最大子数组III

简介: 题目描述   给定一个整数数组和一个整数 k,找出 k 个不重叠子数组使得它们的和最大。每个子数组的数字在数组中的位置应该是连续的。   返回最大的和。 注意事项   子数组最少包含一个数 样例   给出数组 [-1,4,-2,3,-2,3] 以及 k = 2,返回 8 思路   dp[i][j] = max(dp[x][j-1]+maxs[x+1][i])   dp[i][j] 表示前 i 个数中 j 个子数组的最大值,   maxs[i][j] 表示 第i个数到第j个数中最大子数组的和。

题目描述

  给定一个整数数组和一个整数 k,找出 k 个不重叠子数组使得它们的和最大。每个子数组的数字在数组中的位置应该是连续的。

  返回最大的和。

注意事项

  子数组最少包含一个数

样例

  给出数组 [-1,4,-2,3,-2,3] 以及 k = 2,返回 8

思路

  dp[i][j] = max(dp[x][j-1]+maxs[x+1][i])

  dp[i][j] 表示前 i 个数中 j 个子数组的最大值,

  maxs[i][j] 表示 第i个数到第j个数中最大子数组的和。

代码

public class Solution {
    /**
     * @param nums: A list of integers
     * @param k: An integer denote to find k non-overlapping subarrays
     * @return: An integer denote the sum of max k non-overlapping subarrays
     */
    public int maxSubArray(int[] nums, int k) {
        // write your code here

        int[][] maxs = new int[nums.length][nums.length];
        int[][] dp = new int[nums.length][k+1];

        for(int i=0; i<nums.length; ++i) {
            for(int j=i; j<nums.length; ++j) {
                maxs[i][j] = maxSum(nums, i, j);
            }
        }
        
        for(int i=0; i<dp.length; ++i) {
            for(int j=0; j<dp[i].length; ++j) {
                dp[i][j] = Integer.MIN_VALUE;
            }
        }

        for(int i=0; i<dp.length; ++i) {
            dp[i][1] = maxs[0][i];
        }

        for(int i=1; i<nums.length; ++i) {
            for(int j=2; j<=k; ++j) {
                for(int x=j-2; x<i; ++x) {
                    dp[i][j] = Math.max(dp[i][j], dp[x][j-1] + maxs[x+1][i]);
                }
            }
        }
        return dp[nums.length-1][k];
    }

    private int maxSum(int[] nums, int i, int j) {
        int sum = 0, maxs = Integer.MIN_VALUE;
        for(int x = i; x <= j; ++x) {
            sum += nums[x];
            if (maxs < sum) {
                maxs = sum;
            }
            if (sum < 0) {
                sum = 0;
            }
        }
        return maxs;
    }

}

  

目录
相关文章
|
人工智能 自然语言处理 UED
微软最新 Sora 分析论文,从中可以看到 Sora 有哪些局限?
【2月更文挑战第17天】微软最新 Sora 分析论文,从中可以看到 Sora 有哪些局限?
307 2
微软最新 Sora 分析论文,从中可以看到 Sora 有哪些局限?
fbh
|
Web App开发 缓存 Linux
Chrome浏览器强制刷新页面(不使用缓存)
在Chrome浏览器中按下F5或 Ctrl+F5 都没用,Chrome总是会强制使用页面缓存进行刷新,如何不使用页面缓存进行刷新? Chrome官方推荐使用如下快捷键,就可以不使用页面缓存进行刷新 Windows和Linu...
fbh
11300 0
|
算法 Java
一些常见的垃圾回收算法
这些是常见的垃圾回收算法,每个算法都有其优点和适用场景。
|
Kubernetes 调度 数据格式
5分钟搞懂K8S的污点和容忍度(理论+实战)
本文主要快速讲解Kubernetes的污点和容忍度,一句话总结:如果Pod能容忍某个节点上的污点,那么Pod就可以调度到该节点。
5分钟搞懂K8S的污点和容忍度(理论+实战)
|
存储 人工智能 缓存
官宣开源|阿里云与清华大学共建AI大模型推理项目Mooncake
2024年6月,国内优质大模型应用月之暗面Kimi与清华大学MADSys实验室(Machine Learning, AI, Big Data Systems Lab)联合发布了以 KVCache 为中心的大模型推理架构 Mooncake。
|
存储 缓存 NoSQL
Redis经典问题:BigKey问题
BigKey问题常困扰着Redis用户,其影响不容忽视。本文将深入探讨BigKey问题的本质及解决方案,帮助你优化Redis性能,提升系统稳定性。
975 2
|
PHP 开发者
PHP中的面向对象编程:从新手到专家
在PHP的世界中,面向对象编程(OOP)是一块基石,它让代码更加模块化、可复用且易于维护。本文将带你走进PHP的OOP世界,从基础概念入手,逐步深入到高级特性,让你的编程技能如虎添翼。
|
API 数据库 开发工具
基于SiliconCloud快速体验GraphRag.Net
基于SiliconCloud快速体验GraphRag.Net
610 0
|
存储 自然语言处理 JavaScript
NUS CS1101S:SICP JavaScript 描述:五、使用寄存器机进行计算(4)
NUS CS1101S:SICP JavaScript 描述:五、使用寄存器机进行计算(4)
146 0
|
测试技术
技术分享 | Web测试方法与技术实战演练
实战演练章节需要结合本章节所学知识点,完成对 web 产品的测试用例设计练习。