【算法】第三章作业 实践报告

【算法】实践第三章作业

1. 实践题目 

最大子段和 

2. 问题描述

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

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

3. 算法描述

#include <iostream>

using namespace std;

int main(int argc, char** argv) {

int i=0,n;  //变量i存储最大值

cin>>n;

int a[10000];

for(int j=1;j<=n;j++)

cin>>a[j];

for(int j=1;j<=n;j++)

{

if(a[j]+a[j+1]>a[j+1])

a[j+1]=a[j]+a[j+1];  //a[j]+a[j+1]>a[j+1],说明这两个数都可以取,均在之后的最大字段和中

if(a[j+1]>i)

  i=a[j+1];  //存储最大值,当均为负数是,i为0,也符合情况。

}

cout<<i;

}

4. 算法时间及空间复杂度分析(要有分析过程)

很显然,算法描述中,代码段/*for(int j=1;j<=n;j++){}*/中,a[]为一维数组,时间复杂度为On;  空间复杂度也为On),一维数组中,每次的遍历操作。

5. 心得体会(对本次实践收获及疑惑进行总结)

在做这一次题目中,一开始我和队友都没有清楚的头绪,一开始按照上题数字三角形的思路,将a[n-1][j]=max([n][j]+a[n][j],[n][j]+a[n][j])思路类推,可是推了一遍,并不成立,然后我就考虑三个连续数作为对象看是否行得通,但是也不行,之后搭档就提出了他自己的建议,思路可以与上一题类似,但是逻辑上应该改变一下,另外定义一个变量值i,根据最大字段和的连续性,a[j]+a[j+1]>a[j+1]的真假,确定对i值量,以次递推,直到循环终止,另外与上一题三角形不同的是上一题是一原本的a[n-1]存储,这次是另外定义变量存储。这次也实践很感谢我的队友!

 

猜你喜欢

转载自www.cnblogs.com/Jergens/p/9906650.html