最大子序列和

原创 2015年07月07日 10:14:58

参考:http://www.cnblogs.com/zhangchaoyang/articles/2012070.html

  • 最大子序列是要找出由数组成的一维数组中和最大的连续子序列。比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大;而 {5,-6,4,2}的最大子序列是{4,2},它的和是6。

  • 思路:用数组P[i]记以i结尾的子序列的和,max记当前子序列的最大和,end记最大子序列和的结束坐标;
    if P[i-1]>0:P[i]=P[i-1]+a[i];
    else:P[i]=a[i]

  • 理解起来就是说,以i结尾的子序列,如果i-1得到的最大子序列是一个负数,那么不管a[i]是多少,加上a[i]之后得到的和总会比a[i]还要小,那还不如舍弃i-1的和,单独留下a[i]反而比加上i-1的和大。还有一种理解是:若P[i-1]+a[i]>a[i]那么P[i]=P[i-1]+a[i]否则P[i]=a[i],这种理解化简一下就是上一种理解。

  • 并且每次更新P[i]的时候,都要去更新max,如果max被更新了,那么end也要更新。最终输出子序列的时候从end开始往前找,直到P[i]<=0为止。

  • 代码如下:时间复杂度O(n) 空间复杂度O(n)

int longestsum(int a[], int n)//动态规划算法 S[i]=max(S[i-1]+a[i] , a[i]) 表示以当前a[i]结尾的最大子序列和
{
    //复杂度O(N)
    int S[10];//记和
    S[0] = a[0];//初始化首位
    int end = 0;//结束位置
    int max = a[0];//最大值
    for (int i = 1; i < n; i++)
    {
        S[i] = ((S[i - 1] + a[i])>a[i]) ? (S[i - 1] + a[i]) : a[i];
        if (S[i] > max)
        {
            max = S[i];
            end = i;
        }
    }
    while (S[end] > 0)
    {
        cout << a[end] << " ";
        end--;
    }
    cout << endl; cout << max << endl;
    return max;
}

poj 2189/3061 贪心(找连续的羊圈/连续子序列之和大于limit的最短序列)

题意:已知一行羊圈两两相连,中间由一个栅栏分开。给栅栏编号1-n,那么一共有n-1个羊圈。给定m个羊所在的位置,比如一个羊在x,那么表示他在x和x+1所围住的羊圈中。再给定一个常数c,求最大的连续区间...
  • dumeichen
  • dumeichen
  • 2015年10月04日 22:44
  • 183

数据结构一:最大子序列和问题

在MOOC学习了C语言之后,深深觉得之前对C语言的理解以及使用都只是在隔靴搔痒,其中除了当时自己没有那么认真以外,老师的教学水平差距应该也是一个必不可少的差距。显然浙大老师的讲课方式以及经验和专业性都...
  • zzyycclove
  • zzyycclove
  • 2015年03月18日 20:16
  • 385

数组最大子序列的和

/************************************************************************/ /* 求最大子序列的和,时间复杂度Q(N) ...
  • liuyi1207164339
  • liuyi1207164339
  • 2016年04月21日 22:39
  • 478

数据结构--最大子序列和(使用分治策略和递归)

例如对于输入:-2,11,-4,13,-5,-2答案为20   为方便起见 若所有整数为负数 则最大子序列和为0 算法一: 分治策略:其想法是把问题分成大致相等的子问题,然后递归的对他们求解,这是“...
  • u012411414
  • u012411414
  • 2015年03月04日 12:35
  • 421

九度OJ 1077 最大子序列和 (动态规划)

题目1077:最大序列和 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4836 解决:1401 题目描述: 给出一个整数序列S,其中有N个数,定义其中一个非空连续子...
  • wdkirchhoff
  • wdkirchhoff
  • 2014年12月16日 12:00
  • 2187

最大子序列求解及分治算法的一些例子

题目大概意思是:在一个乱序的数列中,找出其相加之和最大的子列。例如在[-2,1,-3,4,-1,2,1,-5,4]子列为[4,-1,2,1]有最大和为6。 我的解题思路就是做一个历遍,首先从数列第一...
  • smarter_shability
  • smarter_shability
  • 2017年03月07日 10:27
  • 252

编程练习:找到和最大的子序列

概念: 当前位置:本算法只遍历一边,当前遍历到的位置 子序列:位置连续的几个数 当前子序列:当前要考虑的子序列,这里设定当前子序列是负就要舍弃 临时和最大子序列:遍历没完成前,临时...
  • span76
  • span76
  • 2015年12月22日 19:13
  • 333

【数据结构和算法分析】最大子序列求和问题及联机算法

最大子序列求和问题
  • huyuanjava
  • huyuanjava
  • 2014年07月26日 13:00
  • 986

HDOJ 1003 最大子序列和(DP)

HDOJ 1003 摘自:http://m.blog.csdn.net/u013555159/article/details/50532173该题应用动态规划思想我们可以从几个角度来分析这个问题,我...
  • qq_37360631
  • qq_37360631
  • 2017年08月07日 10:12
  • 184

分治法求最大子序列和

写在前面,有个疑问,这种算法好像数组长度只能是偶数,但实际是奇数也可以,没想明白,改天在考虑。 第一个自己写的分治法的题,有点小激动,hoho~~ 思路: 分治,分治,一个是分:不断将大问题分解...
  • qq_39557517
  • qq_39557517
  • 2017年10月10日 21:41
  • 79
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最大子序列和
举报原因:
原因补充:

(最多只允许输入30个字)