A1007 Maximum Subsequence Sum (25 分| 动态规划,附详细注释,逻辑分析)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_24452475/article/details/100586381

写在前面

  • 思路分析
    • 求最大连续子序列和,输出最大和以及这个子序列开始值和结束值。
    • 如果所有数都小于0,最⼤和为0,输出首尾元素
      • sum最大和, tmp临时最大和, linx和rinx为子序列下标,tinx标记left临时下标
      • tmp = tmp + v[i],当tmp比sum大,更新sum值、 linx和rinx的值
      • 当tmp < 0,那么后面不管来什么值,都舍弃tmp < 0前面的内容
        • 负数对于只可能拉低总和,不可能增加总和
        • 舍弃后,令tmp = 0,更新left临时值tinx
  • 学习ing

测试用例

  • input:
    10
    -10 1 2 3 4 -5 -23 3 7 -21
    
    output:
    10 1 4
    
    2 -1 0 应输出 0 0 0
    
    1 0 应输出 0 0 0
    
    2 -1 -2 应输出0 -1 -2 
    

ac代码

  • #include <iostream>
    #include <vector>
    using namespace std;
    
    int main()
    {
        int n;
        scanf("%d", &n);
    
        vector<int> v(n);
        int linx=0, rinx=n-1, sum=-1, tmp=0, tinx=0;
    
        for(int i=0; i<n; i++)
        {
    
            scanf("%d", &v[i]);
            tmp+=v[i];
            if(tmp<0)
            {
                tmp =0;
                tinx = i+1;
            }
            else if(tmp>sum)
            {
                sum = tmp;
                linx = tinx;
                rinx = i;
            }
        }
    
        if(sum < 0) sum = 0;
        printf("%d %d %d",sum, v[linx], v[rinx]);
        return 0;
    }
    

知识点小结

  • 动态规划(dynamic programming,DP
    • 对每个输入元素进行探测,是1个子过程,每1个子过程都判断是否能得到符合要求的序列,得到最优解,这是一种动态规划的思想。
    • 样例解释
      在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_24452475/article/details/100586381