算法第三章上机实践报告
实践题目
7-2 最大子段和
问题描述
给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],...,a[n],求该序列如a[i]+a[i+1]+...+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。
要求算法的时间复杂度为O(n)。
算法描述
将每一个数是否列入当前子段作为一个决策,
1.如果加上这个数后子段和仍然大于0,那么加上这个数
2.如果加上这个数后子段和小于0,那么子段清零,下一个数作为新的子段的开始
在这个过程中记录遇到的最大子段和
算法时间及空间复杂度分析(要有分析过程)
该算法中只有一个 for循环语句,因此时间复杂度为O(n),满足题目要求。
空间复杂度为O(n)。
心得体会(对本次实践收获及疑惑进行总结)
解决最大子段和问题,进一步加深对动态规划算法的理解与运用。
code:
int MaxSum(int n, int *a) {
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;
}
return sum;
}
int main() {
int n;
cin >>n;
int a[n+1];
bool resultOne = false;
for(int i = 1; i <= n; i++) {
cin >> a[i];
if(a[i] > 0 ) resultOne = true;
}
int maxSum = 0;
if(resultOne) maxSum = MaxSum(n, a);
cout << maxSum;
}