7-2 最大子段和
给定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; const int MAX = 10000; int B[10000]; int maxSum (int* a , int n); int main() { int num = 0; cin >> num; for (int i = 0 ; i < num ; i ++ ) { cin >> B[i]; } cout << maxSum(B , num); return 0; } int maxSum (int* a , int n) { int temp = 0; int sum = 0; for (int i = 0 ; i < n ; i ++ ) { temp = (temp + a[i]) > a[i] ? (temp + a[i]) : a[i]; if (temp > sum) sum = temp; } return sum; }
空间复杂度分析与体会
空间复杂度为O(n)。
如果问题满足优化原则或者最优子结构性质。即:一个最优决策序列的任何子序列本身一定是相对于子序列的初始和结束状态的最优决策序列,就可以考虑使用该算法。其中的关键是能否找到该问题的递推方程式。