最大子序列和

原创 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;
}

最大子序列和

  • 2015年09月11日 16:45
  • 4KB
  • 下载

C 最大子序列算法

  • 2015年03月14日 17:46
  • 2KB
  • 下载

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

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

最大子序列求和

  • 2014年09月08日 22:13
  • 388B
  • 下载

最大子序列和问题求解源代码

  • 2010年09月07日 17:47
  • 500KB
  • 下载

(C#)找出数组中最大子序列之和,分别以O(N^2),O(NlogN),O(N) 这3种时间复杂度求解

/* * 找出数组中最大子序列之和,分别以O(N^2),O(NlogN),O(N) 这3种时间复杂度求解 */ using System; using System.Collections.Ge...

最大子序列和MAX-SUM

  • 2008年10月12日 10:24
  • 465B
  • 下载

最大子序列和问题四种算法源代码

  • 2017年03月10日 10:04
  • 1.64MB
  • 下载

数据结构与算法分析--最大子序列和问题

**最大连续子数列和一道很经典的算法问题,给定一个数列,其中可能有正数也可能有负数,我们的任务是找出其中连续的一个子数列(不允许空序列),使它们的和尽可能大。我们一起用多种方式,逐步优化解决这个问题。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:最大子序列和
举报原因:
原因补充:

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