算法第三章上机实践报告

一、实践题目

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
using namespace std;
const int maxn=1e4+10;
int a[maxn];
int main()
{
 int n;
 cin>>n;
 for(int i=0;i)
  cin>>a[i];
 int thissum=0,maxsum=0;
 for(int i=0;i){
  thissum+=a[i];
  if(thissum>maxsum)
   maxsum=thissum;
  else if(thissum<0)
   thissum=0;
 }
 cout<endl;
 
}

第一步:把输入的数用数组存起来

第二步:设置两个值初始化为一,一个保存从左往右的和T,一个保存连续子序列的最大值M,即结果

第三步:从左往右,一个一个的加,首先是左边第一个值赋给T,如果大于M,把值赋给M。如果小于0,把T的值更新为0。其他情况,不做任何操作。

第四步:一直加,直到加到最后一位,然后输出M

 

四、算法时间及空间复杂度分析(要有分析过程)

时间复杂度:把输入值存起来,花的时间是O(n);每个数相加,加O(n);做比较次数O(n);

所以时间复杂度为O(n)

空间复杂度:开辟了存储n个数的数组,是个常量,空间复杂度为O(1);

 

五、心得体会(对本次实践收获及疑惑进行总结)

收获:对每个问题依赖子问题的求解的理解更深

你可能感兴趣的:(算法第三章上机实践报告)