【算法】实践第三章作业
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[]为一维数组,时间复杂度为O(n); 空间复杂度也为O(n),一维数组中,每次的遍历操作。
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]存储,这次是另外定义变量存储。这次也实践很感谢我的队友!