順序表應用8:最大子段和之動態規劃法

男孩lim發表於2020-11-18

Description

給定n(1<=n<=100000)個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均為負數時定義子段和為0,依此定義,所求的最優值為: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。 例如,當(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)時,最大子段和為20。

 

注意:本題目要求用動態規劃法求解,只需要輸出最大子段和的值。

Input

第一行輸入整數n(1<=n<=100000),表示整數序列中的資料元素個數;

第二行依次輸入n個整數,對應順序表中存放的每個資料元素值。

Output

輸出所求的最大子段和

 

Sample

Input 

6
-2 11 -4 13 -5 -2

Output 

20

Hint

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int main()
{
    int n, b = 0, maxx = 0;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
    }
    for(int i = 1; i <= n; i++)
    {
        b = max((b + a[i]), a[i]);
        if(b > maxx)
        {
            maxx = b;
        }
    }
    printf("%d\n", maxx);
    return 0;
}

 

相關文章