算法第三章上机实践报告

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
3.算法描述:

#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的作用,还有为什么这样就可以算到从不同位置开始的最大字段和,并加以比较得出最终的结果。可是在与队友的帮助和细心解析下,我很快就弄懂了,如果像以往一样是单独一个人编程发话,这个问题可能会困扰我一整天。所以,我觉得结队编程可以提高我们解题以及解决其他困难的效率。

 

 

posted @ 2018-11-11 22:34  杨纸巾  阅读(148)  评论(0)    收藏  举报