算法第三章上级实践报告

一、实践题目

 

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

二、问题描述

 

给出一段序列,求其中一段连续序列的最大值。

 

三、算法描述

 

递推方程式:dp[i] += dp[i-1];

易知当一段序列和为负数的时候必定不会是最大值。

设置一个a[]数组将存放整数

在循环过程中,用一个 ans  记录最大值。

 

具体代码:

 

int n;
int a[10005];
while(scanf("%d",&n)!=-1)
{
for(int i=0; i<n; i++)
{
scanf("%lld",&a[i]);
}
int ans=0,dp=0;
for (int i=0; i<n; i++)
{
if(dp>0)
dp+=a[i];
else
dp=a[i];
if(dp>ans)
ans=dp;
}
cout<<ans<<endl;
}

 

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

 

时间复杂度:1 + n * ( 1 + 1 + 1 * ( 1 + 1 ) ) + 1 = 1 + n + 1 = O(N)

 

空间复杂度:1 + 1 + 1 + 1 = O(1)

 

 

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

 和队友一起研究了一下,第一第二题基本大同小异,在第三题卡了很久,最后发现是局部变量占用内存太多,设置全局变量就解决了。

posted @ 2018-11-05 16:19  Archer丶kk  阅读(144)  评论(0编辑  收藏  举报