算法第三章上机实践报告
Posted chanchanchan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法第三章上机实践报告相关的知识,希望对你有一定的参考价值。
1.实践题目
7-2最大子段和 给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。
要求算法的时间复杂度为O(n)。
2.问题描述
输入格式:
输入有两行:
第一行是n值(1<=n<=10000);
第二行是n个整数。
输出格式:
输出最大子段和。
输入样例:
在这里给出一组输入。例如:
6
-2 11 -4 13 -5 -2
输出样例:
在这里给出相应的输出。例如:
20
#include <iostream> using namespace std; int n,a[10001]; int main(){ cin >> n; for(int i=1;i<=n;i++){ cin >> a[i]; } int sum = 0,b = 0; for(int i =1;i <= n;i++){ if (b>0) b += a[i]; else b = a [i]; if (b>sum) sum = b; } cout << sum; return 0; }
3.算法描述
一番讨论过后,我们决定首先建立一个数组存放值,另外还设了b用于暂时存放最大子段和的值,并通过与最终值sum比较来确定最终最大子段和的值
代码如下:
for(int i =1;i <= n;i++){
if (b>0) b += a[i];
else b = a [i];
if (b>sum) sum = b;
}
4.算法时间及空间复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)
5.心得体会(对本次实践收获及疑惑进行总结)
本次实践我和我的队友彦君完成了两题,主要是在第一题花的时间比较多,期间我们讨论了很多,可能是当时对于动态规划的思想还掌握不够的原因,我们的进程要落后其他同学很多,不过最后我们还是解决了问题,彼此也收获了很多;
第二题的话由于本身题型比较简单,并且书上也相关的例子,所以我们没有花费太多的时间就解决了,但是由于我对题目的理解出现了偏差,导致不能够给予老师满意的回答,不过我最终还是在彦君的帮助下通过了,这让我对于动态规
划思想的理解更加深刻了。
以上是关于算法第三章上机实践报告的主要内容,如果未能解决你的问题,请参考以下文章