最大子序列和

参考: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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值