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
#include <iostream> using namespace std; 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[10000]; for (int i = 1; i <= n; i++){ cin >> a[i]; } cout << MaxSum(n, a); }
时间空间复杂度都是O(n)
看了书上的代码,受益良多,故能打出此代码。下次争取完全由自己打出代码=。=