给定N个整数(可能但不全为负),如{-13, 11, -4, 13, -5, -2},求最大子段和,如例中a1到a3,最大子段和为20.
最简单的是3重循环:2重遍历,1重求和。时间复杂度:O(n3)
改进方法之一:可以通过sum(i:j-1)+a(j)来求sum(i:j)。时间复杂度:O(n2)
改进方法之二:动态规划法//segmentMaxSum.cpp #include <iostream> int maxSum(int n ,int a[], int &besti ,int &bestj); int main() { int a[] = {-13, 11, -4, 13, -5, -2}; int besti = 0 ,bestj = 0; int n = 6; std::cout<<"The maxSum is "<<maxSum(n,a,besti,bestj); std::cout<<" from "<<besti+1<<" to "<<bestj+1<<std::endl; return 0; } int maxSum(int n ,int a[], int &besti ,int &bestj) { int maxsum = 0; for(int i =0; i < n; i++) { int thissum = 0; for (int j = i; j < n; j++) { thissum += a[j]; if (maxsum < thissum) { besti = i; bestj = j; maxsum = thissum; } } } return maxsum; }
//segmentMaxSum_dp.cpp #include <iostream> int maxSum(int n ,int a[]); int main() { int a[] = {-13, 11, -4, 13, -5, -2}; int n = 6; std::cout<<"The maxSum is "<<maxSum(n,a)<<std::endl; return 0; } int maxSum(int n ,int a[]) { int maxsum = 0, sum = 0; for(int i=0; i < n; i++) { if ( sum > 0 ) sum += a[i]; else sum = a[i]; if ( sum > maxsum ) maxsum = sum; } return maxsum; }