关闭

最大子序列和

标签: 动态规划C++
124人阅读 评论(0) 收藏 举报
分类:

参考: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;
}
0
0

猜你在找
【套餐】Hadoop生态系统零基础入门
【套餐】嵌入式Linux C编程基础
【套餐】2017软考系统集成项目——任铄
【套餐】Android 5.x顶级视频课程——李宁
【套餐】深度学习入门视频课程——唐宇迪
【直播】广义线性模型及其应用——李科
【直播】从0到1 区块链的概念到实践
【直播】计算机视觉原理及实战——屈教授
【直播】机器学习之凸优化——马博士
【直播】机器学习&数据挖掘7周实训--韦玮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:922次
    • 积分:75
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档