算法第三章上机实践报告
1.时间题目:最大字段和
2.问题描述:
给定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>
using namespace std;
int main(int argc, char** argv) {
int n;
cin>>n;
int k=0,sum=0;
int a[n+1];
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
if(k>0) k+=a[i];
else k=a[i];
if(k>sum) sum=k;
}
cout<<sum<<endl;
return 0;
}
4.算法时间及空间复杂度分析:
算法里用了for(int i=1;i<=n;i++)来求最大的连续字段和,所以时间复杂度为O(n),另外算法中只定义了一个一维数组a[n+1]来存放数据,因此空间复杂度为O(n)。
5.心得体会:
通过这次的结队编程,我觉得可以提高我们的效率。虽然这一题的算法代码看起来很短,可是其实一开始我并不是很理解它的解法,一直搞不懂sum的作用,还有为什么这样就可以算到从不同位置开始的最大字段和,并加以比较得出最终的结果。可是在与队友的帮助和细心解析下,我很快就弄懂了,如果像以往一样是单独一个人编程发话,这个问题可能会困扰我一整天。所以,我觉得结队编程可以提高我们解题以及解决其他困难的效率。

浙公网安备 33010602011771号