最大子序列和
1 #include "stdafx.h" 2 #include <iostream> 3 #include <vector> 4 using namespace std; 5 int flag = 0; 6 long maxsum(const vector<int>& a)//时间复杂度O(n3) 7 { 8 if (flag == 0) 9 { 10 return 0; 11 } 12 long maxsum = 0; 13 for (int i = 0; i < a.size(); i++) 14 { 15 for (int j = i; j < a.size(); j++) 16 { 17 long thissum = 0; 18 for (int k = i; k <= j; k++) 19 { 20 thissum += a[k]; 21 22 } 23 if (thissum>maxsum) 24 maxsum = thissum; 25 } 26 } 27 return maxsum; 28 } 29 long maxsum2(const vector<int>& a)//时间复杂度O(n2) 30 { 31 if (flag == 0) 32 { 33 return 0; 34 } 35 long maxsum = 0; 36 for (int i = 0; i < (int)a.size(); i++) 37 { 38 long thissum = 0; 39 for (int j = i; j < (int)a.size(); j++) 40 { 41 thissum += a[j]; 42 if (thissum > maxsum) 43 maxsum = thissum; 44 } 45 } 46 return maxsum; 47 } 48 long maxsum3(const vector<int>& a)//时间复杂度O(n) 49 { 50 if (flag == 0) 51 { 52 return 0; 53 } 54 long maxsum = 0, thissum = 0; 55 for (int i = 0; i < (int)a.size(); i++) 56 { 57 thissum += a[i]; 58 59 if (thissum > maxsum) 60 maxsum = thissum; 61 else if (thissum < 0) 62 { 63 thissum = 0; 64 } 65 } 66 return maxsum; 67 } 68 long maxsum4(const vector<int>& a,int left,int right) //时间复杂度n*log(n) 69 { 70 if (flag == 0) 71 { 72 return 0; 73 } 74 if (left == right) 75 { 76 if (a[left] > 0) 77 { 78 return a[left]; 79 } 80 else 81 { 82 return 0; 83 } 84 85 } 86 int center = (left + right) / 2; 87 long maxleftsum = maxsum4(a, left, center); 88 long maxrightsum = maxsum4(a, center + 1, right); 89 90 long LBorder_maxsum = 0, LBorder_thissum = 0; 91 for (int i = center; i >= left; i--) 92 { 93 LBorder_thissum += a[i]; 94 if (LBorder_thissum > LBorder_maxsum) 95 { 96 LBorder_maxsum = LBorder_thissum; 97 } 98 } 99 long RBorder_maxsum = 0, RBorder_thissum = 0; 100 for (int j = center + 1; j <= right; j++) 101 { 102 RBorder_thissum += a[j]; 103 if (RBorder_thissum > RBorder_maxsum) 104 { 105 RBorder_maxsum = RBorder_thissum; 106 } 107 } 108 109 if (maxleftsum < maxrightsum) 110 { 111 maxleftsum = maxrightsum; 112 } 113 if (maxleftsum>(LBorder_maxsum + RBorder_maxsum)) 114 { 115 return maxleftsum; 116 } 117 else 118 { 119 return (LBorder_maxsum + RBorder_maxsum); 120 } 121 122 } 123 int main(void) 124 { 125 int K; 126 int temp; 127 128 cin >> K; 129 vector<int>arry; 130 for (int i = 0; i < K; i++) 131 { 132 cin >> temp; 133 arry.push_back(temp); 134 if (temp >= 0) 135 { 136 flag = 1; 137 } 138 139 } 140 //cout <<maxsum(arry)<< endl; 141 //cout <<maxsum2(arry)<< endl; 142 //cout <<maxsum3(arry)<< endl; 143 cout << maxsum4(arry,0,arry.size()-1) << endl; 144 return 0; 145 }