1.17-1 最大子段和 (25 分)

给定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

结尾无空行

1.2算法描述

数组D[i]存储的是从第i个数开始到最后一个数的最大子段和,数组X[i]存储的是第i个数的数值,求解D[i]就要先将D[i+1]算出来再看D[i+1]的值是否大于0来决定D[i]是等于D[i+1]+X[i]还是等于x[i]。最后用max存最大的D[i]。

1.3问题求解

#include<iostream>

using namespace std;

int main(){

int n, max=X[n];

cin >> n;

    int D[9999]={0};

    int X[9999]={0};

    for(int i=0; i<n; i++){

        cin >> X[i];

    }

for(int i=n-1; i>0; i--){

        if(D[i+1]>0)

            D[i]=X[i]+D[i+1];

        else

            D[i]=X[i];

        if(D[i]>max)

            max=D[i];

    }

    cout << max;

return 0;

}

1.1.1递归方程

If(D[i+1>0]D[i]=D[i+1]+X[i]

Else D[i]=X[i]

1.1.2表维度,范围,顺序

一维  1到n  n到1

1.1.3

时间复杂度为O(n)

 

1.2心得体会

本次实验题目算是比较简单的,但是对于动态规划还有递归的一些基础性内容的理解还是不够透彻,不够经过老师同学的帮助还有北航课程,理解倒也深入了许多,非常有利于动态规划的学习。