算法第三章上级实践报告
一、实践题目
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)。
五、心得体会(对本次实践收获及疑惑进行总结)
和队友一起研究了一下,第一第二题基本大同小异,在第三题卡了很久,最后发现是局部变量占用内存太多,设置全局变量就解决了。