标签:最大值 hellip 问题 重要 class iostream for循环 组成 空间
一、实践题目
最大子段和
二、问题描述
给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时,定义子段和为0。
要求算法的时间复杂度为O(n)。
三、算法描述
定义MaxSum函数记录字段和的最大值;
首先判断下一个数是否列入当前子段:
如果当前子段加上下一个数大于0,列入当前子段;
如果下一个数加上当前子段小于0,舍弃当前子段;将下一个数作为新子段的开始;
每次循环都会将最大的子段和存储;最后找出最大子段和;
#include <iostream> using namespace std; int MaxSum(int n,int*a); int main() { int n; int a[100]; cin>>n; for(int i = 1;i <= n;i++) { cin>>a[i]; } cout<<MaxSum(n,a); } int MaxSum(int n,int*a) { int sum = 0, b = 0; for(int i = 1;i <= n;i++) { if(b>0) b=b+a[i]; else b = a[i]; if(b>sum) sum = b; } return sum; }
四、算法时间及空间复杂度分析
整段程序只有一个for循环,时间复杂度为O(n);
空间复杂度为O(n);
五、心得体会
动态规划对于优化算法时间复杂度的重要性
标签:最大值 hellip 问题 重要 class iostream for循环 组成 空间
原文地址:https://www.cnblogs.com/lqa00/p/11716525.html