算法第三章上机实践报告
一、实践题目
7-2 最大子段和 (40 分)
给定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
二、问题描述
输入:数的个数,和算术数
求解:求某个连续子字段的最大值。如果最大的数为负数,则定义连续子字段的最大值为0.
输出:连续子字段的最大值。
三、算法描述
#include<iostream> using namespace std; const int maxn=1e4+10; int a[maxn]; int main() { int n; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; int thissum=0,maxsum=0; for(int i=0;i<n;i++){ thissum+=a[i]; if(thissum>maxsum) maxsum=thissum; else if(thissum<0) thissum=0; } cout<<maxsum<<endl; }
第一步:把输入的数用数组存起来
第二步:设置两个值初始化为一,一个保存从左往右的和T,一个保存连续子序列的最大值M,即结果
第三步:从左往右,一个一个的加,首先是左边第一个值赋给T,如果大于M,把值赋给M。如果小于0,把T的值更新为0。其他情况,不做任何操作。
第四步:一直加,直到加到最后一位,然后输出M
四、算法时间及空间复杂度分析(要有分析过程)
时间复杂度:把输入值存起来,花的时间是O(n);每个数相加,加O(n);做比较次数O(n);
所以时间复杂度为O(n)
空间复杂度:开辟了存储n个数的数组,是个常量,空间复杂度为O(1);
五、心得体会(对本次实践收获及疑惑进行总结)
收获:对每个问题依赖子问题的求解的理解更深
浙公网安备 33010602011771号