动态规划求解数组连续最大和

1、动态规划的思想

动态规划即把全局问题的解分解为一个个子问题的解,一个个子问题的解存在递推关系,即上一个问题的解是下一个问题解的基础,这样直到求解出全局问题的解。

2、求一个数组中连续几个数相加的最大值;

给定一个数组,它里面全是一些数字,要找出任何连续的值中最大的和. 例: 已有数组:{31,-41,59,26,-53,58,97,-93,-23,84}

它的连续的值最大的和则是第 2 个值到第 6 个值的合:187.

3、求解过程

sum(i)表示前i个数的和,max(i)表示长度为i的数组的连续最大和:

max(0)=sum(0)=array(0);

sum(i)=sum(i-1)+array(i):if sum(i) < 0 说明对整个连续和没有贡献,则将其修改为0,重新累计和;

max(i)=sum(i)==0?Max(max(i-1),array(i)):Max(sum(i),max(i-1)):sum(i)为0,说明被修正过,因为加完array(i)

为负数故修正,此时,max(i)是在max(i-1)和当前元素array(i)间产生,

否则加完array(i)为正,说明对连续和有贡献,则在max(i-1)和sum(i-1)间产生。

4、java代码

public class ContinueSum {

private static int continueSum(int [] toSearch) {

int maxSofar = Integer.MIN_VALUE;

int n = toSearch.length;

int maxEnding = 0;

for (int i = 0; i < n; i++)

{

maxEnding = Math.max(maxEnding + toSearch[i], 0);

if(maxEnding==0)

maxSofar = Math.max(maxSofar, toSearch[i]);

else

maxSofar = Math.max(maxSofar, maxEnding);

}

System.out.println(maxSofar);

return maxSofar;

}

public static void main(String[] args){

int[] a ={-3,-2,-1,4,2};

continueSum(a);

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-02 07:01:59

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

动态规划求取连续数组最大和

int main() { const int size=10; int array[size]={3,-3,-4,10,-11,2,-3,5,-7,-3}; int MaxSumOfArray[size]={0}; MaxSumOfArray[0]=array[0]; int currentSum=0; for(int i=1;i<size;i++){     currentSum+=array[i];        if(currentSum>=0)        {        MaxS

分治策略求解数组的最大连续子数组的和

对于一个数组,尽可能地划分成两半(二分),加和最大的连续字数组或者在左边,或者在右边,或者跨越中间,一部分在左边,一部分在右边. 那么只要求出左半段数组的加和最大的连续子数组的和,求出右半段数组的加和最大的连续子数组的和,求出跨越中间的最大连续字数组的和,只要通过三者判断求出最大的那么就是整个数组最大的连续子数组的和. 那么找出左半段和右半段的最大连续子数组的和其实就是比原问题规模更小的一个问题,因此对于左半段和右半段求解加和最大的连续子数组的和可以通过递归求得. 下面给出具体实现:. 首先是调

剑指OFFER 连续数组的最大和

剑指OFFER 连续数组的最大和 经典的动态规划题 其思路是把所有的和都算出来,当然不能简单粗暴的直接相加,要利用上一次计算出的结果加速第二次的运算 class Solution { public: int FindGreatestSumOfSubArray(vector<int> array) { int size = array.size(); int max = INT_MIN; //dp 数组初始化,dp[i][j]表示从i到j的和,例如dp[0][1]表示array[0]+array

动态规划求解最大字段和及其变种问题

动态规划(Dynamic Programming, DP)为一常用算法思想,本文讲述如何利用DP解决常见的最大字段和及其变种问题. 一. 最大字段和问题 问题定义 设数组为a[k],1≤k≤n,最大字段和X定义为: X=max1≤i≤j≤n{∑k=ija[k]} X直观含义即,求任一连续字数组的最大和. 问题分析 不妨设: b[j]=max1≤m≤j{∑k=mja[k]} 其中,1≤j≤n b[j]的直观含义为,以a[j]为结束元素的连续数组的最大和. 由X和b[j]的定义,易知: X=max1

求一维数组中不重叠的两个子数组的最大和

给定一个长度为N的整数数组a,求不重叠的两个子数组的和的最大值. 如a[6]={1, 2, -4, 3, 2, -5}.所取的子数组分别为{1,2}{3, 2}时,两个子数组的和最大,为3+5=8. 这个题目是数组的子数组最大和(即最大连续和)的变形(后面附上了求解子数组最大和的程序). 一种方法是把数组分成两部分([0~i]和[i+1~len-1]),分别求两部分的最大连续和相加,再从中选出最大的.时间复杂度是O(N*N).这种方法在求解最大连续和时会有冗余的计算,需要优化. 第二种方法申请两

动态规划 HDU1231-------最大连续子序列

Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K.最大连续子序列是所有连续子序列中元素和最大的一个, 例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和 为20. 在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该 子序列的第一个和最后

【算法导论之七】动态规划求解最长公共子序列

一.动态规划的概念 动态规划(Dynamic Programming)是通过组合子问题的解而解决整个问题的.分治算法是指将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题的解而得到原始问题的解,与此不同,动态规划适用于子问题不是独立的情况,也就是各个子问题包含公共的子问题.在这种情况下,采用分治法会做许多不必要的工作,即重复地求解公共地子问题.动态规划算法对每个子问题只求解一次,将其结果保存在一张表中,从而避免每次遇到各个子问题时重新计算答案. 动态规划通常应用于最优化问题.此类问

求解最大连续子数组和问题

前言 最近工作不是特别忙,所以有更多时间来学习算法相关知识,补短处.题目来源于leetcode,通过一个算法题,我们去分析该算法题所属类型,以及解题思路,以及该算法题所用到的数学知识.选择的算法题目从容易到困难,逐步提高难度,解题的思路也是从简单到复杂,时间复杂度也是从低到高的顺序来书写这个系列的博客.因工作语言和使用熟练度原因算法采用Java编写,但该系列中可能会穿插c.C++.python语言实现,请不要奇怪. 题目 分析题目:给定的整型数组,求解最大连续子数组和,要求是至少包含一个元素,且

1008-----算法笔记----------0-1背包问题(动态规划求解)

1.问题描述 给定n种物品和一个背包,物品i的重量是wi,其价值为vi,背包的容量为C.问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大? 2.问题分析 上述问题可以抽象为一个整数规划问题,即求满足 (a)Σwixi ≤ C:(b)xi ∈(0,1),  1≤i≤n:条件下,∑vixi最大时的一个物品xi序列.分析问题可以发现,该问题具有最优子结构性质,那么就可以尝试用动态规划方法求解,而动态规划求解的关键就是列出问题的递归关系表达式. 设m(i,j)为背包容量为j,可选物品为i,