动态规划_连续子数组的最大和

题目描述

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)


解答

就是在一个一维数组里找出一段,使其和最大。

动态规划思路:对于第i项来说,要么选择第i项+之前的和,要么只选择第i项抛弃之前的和

也就是

DP[i] = max(dp[i-1]+num[i] , num[i])

对于这道题来说,不需要保存之前的状态,那么用一个sum来记录最大的和就可以了

 public int FindGreatestSumOfSubArray(int[] array) {

        if (array == null || array.length == 0) {
            return 0;
        }
        int sum = array[0];
        int max = array[0];

        for (int i = 1; i < array.length; i++) {
            sum = Math.max(sum + array[i], array[i]);
            if (sum > max) {
                max = sum;
            }
        }
        return max;

    }

原文地址:https://www.cnblogs.com/16crow/p/9568364.html

时间: 2024-10-02 04:48:57

动态规划_连续子数组的最大和的相关文章

【动态规划】连续子数组的最大和

题目 输入一个整型数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为O(n). 例如,输入数组为[1, -2, 3, 10, -4, 7, 2, -5], 最大和的子数组为[3, 10, -4, 7, 2],因此输出该子数组的和18. 解答 1,动态规划,Time: O(N), Space: O(1) 动态规划, f(i)表示以第i个数字结尾的子数组的最大和, 题目求max(f(i)) f(i) = nums[i] i=0 or f(

动态规划:面试题42. 连续子数组的最大和

面试题42. 连续子数组的最大和 题目要求: 解题思路: 1. 定义子问题: dp[i] 为下标以 num[i] 结尾的数组字段 元素最大最短和,i表示子段到当前i位置 i: 2. 寻找关系式: 只有一个元素:dp[0] = num[0]; 两个元素:dp[i] 为num[0], num[1], num[0]+num[1]; 三个元素时:考虑前三个元素,如何求其最?大?子段和?还是分为两种情况讨论,第三个元素在最后的字串串内吗? 若第三个元素也包含在最后的字串串内,则dp[2] = max(dp

剑指offer面试题31连续子数组的最大和

一.题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止).你会不会被他忽悠住? 二.解题思路 求连续子数组的最大和,首先想的到最笨的方法就是暴力解决,两个for循环,遍历数组找到和最大的子

连续子数组的最大和-剑指Offer

连续子数组的最大和 题目描述 输入一个整数数组,数组里有整数也有负数.数组中一个或连续的多个整数组成一个数组.求所有子数组的和的最大值.要求时间复杂度为O(n) 思路 我们可以举例分析数组的规律,用一个变量来存储最大值,另一个变量存储当前的和,若当前和为负值,则后面加的和都会比当前的小,所以当为负值时把当前的和设置为0重新开始计算 我们也可以通过动态规划的方法来解决这个问题 代码 public class Solution { public int FindGreatestSumOfSubArr

连续子数组的最大和问题

参考自:求连续子数组的最大和 求子数组的最大和题目描述:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值.要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18. 思路 一.暴力求法 计算每一个子数组的和,然后求最大值,复杂度O(n3).不推荐,代码就不写了. 二. 动态规划 设sum[i]为以第i个

一个数组中连续子数组的最大和

//连续子数组的最大和     //{ 1, -2, 3, 10, -4, 7, 2, -5 };//最大子数组18     #include<iostream>     using namespace std;     bool g_InValid = false;     int FindGreatSumOfSubArray(int* arr, int size)     {     if (arr == NULL || size <= 0)     g_InValid = true

编程算法 - 连续子数组的最大和 代码(C)

连续子数组的最大和 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 输入一个整型数组, 数组里有正数也有负数. 数组中一个或连续的多个整数组成一个子数组.求所有子数组的和的最大值. 使用一个数保存当前和, 如果当前和为小于0,  则替换新值, 否则, 递加, 使用一个数保存临时最大值. 代码: /* * main.cpp * * Created on: 2014年6月29日 * Author: wang */ #include <stdio

求数组中连续子数组的最大和

问题: 求解数组中连续一段子数组和的最大值.例如:{31,-41,59,26,-53,58,97,-93,-23,84},最大值为59+26-53+58+97=187 思路: 计算出任意i到j之间连续子数组的和再比较必然能得到最大值,但时间复杂度为O(n^2),我们希望能找出线性时间的算法. 我们注意到,假如数组中全为正数,那么最大和必然为全部数相加:如果数组中有负数,并且如果加上某个负数,子数组的和小于0,则最大和子数组必然不包含这个负数. 基于此,给出以下代码: //计算数组中任何连续子数组

【原题】求两个不相交的连续子数组的最大和

题目: 有一个整数数组n,a和b是n里两个互不相交的子数组.返回sum(a)+sum(b)的最大值. 分析: 新建两个数组left和right,left[i]表示n[0:i]的连续子数组的最大和,right[i]表示n[i:length-1]的连续子数组的最大和.left[i]+right[i+1]的最大值就是答案. int SumOfTwoSubarray(const vector<int> &n) { if (n.size() < 2) { throw exception()