算法设计动态规划- 7-2 最大子段和 (40分)

  • Post author:
  • Post category:其他

7-2 最大子段和 (40分)

给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。

要求算法的时间复杂度为O(n)。

输入格式:

输入有两行:

第一行是n值(1<=n<=10000);

第二行是n个整数。

输出格式:

输出最大子段和。

输入样例:

在这里给出一组输入。例如:

6
-2 11 -4 13 -5 -2

输出样例:

在这里给出相应的输出。例如:

20

代码实现:

#include <iostream>
#include <stdlib.h>
#include <memory.h>
#define MAXN 10000
using namespace std;
int main()
{
    int n;
    int z=0;
    int a[MAXN];
    int s[10000][10000];
    cin>>n;
    for (int i=1; i<=n; i++)
    {
        cin>>a[i];
    }
    
    for (int i=1; i<=n; i++)
    {
        if(a[i]<0) z++;
    }
    
    if(z==n) {cout<<0;return 0;}  //所有负数则输出0
    else{
    
            for (int i=1; i<=n; i++) s[i][i] = a[i];    //初始化

            for (int r=2; r<=n; r++)
            {
                for(int i=1 ; i<=n-r+1 ;i++)
                {
                    s[i][i+r-1]=a[i];   //初始化
                    for(int j=i+1; j<=i+r-1 ;j++)    //i+r-1最后一个矩阵编号
                        s[i][i+r-1]+=a[j];      //持续加
                }
            }
            
            int t=s[1][1];
            for (int i=1; i<=n; i++)
            {
                for (int j=i; j<=n; j++)
                {
                    if(t<s[i][j]) t=s[i][j];    //寻找最大的s
                }
            }
            cout<<t;
        }
}

 


版权声明:本文为loglian原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。