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 有哪些局限?
235 2
微软最新 Sora 分析论文,从中可以看到 Sora 有哪些局限?
|
算法 Java
一些常见的垃圾回收算法
这些是常见的垃圾回收算法,每个算法都有其优点和适用场景。
|
12月前
|
存储 人工智能 缓存
官宣开源|阿里云与清华大学共建AI大模型推理项目Mooncake
2024年6月,国内优质大模型应用月之暗面Kimi与清华大学MADSys实验室(Machine Learning, AI, Big Data Systems Lab)联合发布了以 KVCache 为中心的大模型推理架构 Mooncake。
|
存储 自然语言处理 算法
OpenIM Bot: 用LLM构建企业专属的智能客服
OpenIM Bot 通过结合LLM和RAG技术,构建企业专属的智能客服系统。该系统通过优化向量存储、混合检索和查询分析,解决了LLM的幻觉、新鲜度、token长度和数据安全问题,提升了用户体验。向量存储和预处理步骤确保文档高质量,而混合检索结合文本和语义搜索,增强了检索结果的准确性。通过迭代优化,OpenIM Bot 提供了高效、智能的支持服务,减轻了支持团队的负担,提升了问题解决效率。
1390 3
OpenIM Bot: 用LLM构建企业专属的智能客服
|
PHP 开发者
PHP中的面向对象编程:从新手到专家
在PHP的世界中,面向对象编程(OOP)是一块基石,它让代码更加模块化、可复用且易于维护。本文将带你走进PHP的OOP世界,从基础概念入手,逐步深入到高级特性,让你的编程技能如虎添翼。
|
测试技术
技术分享 | Web测试方法与技术实战演练
实战演练章节需要结合本章节所学知识点,完成对 web 产品的测试用例设计练习。
|
5天前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。