1 //最大子数组问题 2 #include <iostream> 3 #include <sstream> 4 using namespace std; 5 6 struct MAX_SUBARRAY 7 { 8 //我发现使用C++11 的元组还不如定义结构体来的方便。 9 MAX_SUBARRAY(int l, int h, int max):low(l), high(h), max_value(max){} 10 std::string toString() 11 { 12 stringstream ss; 13 ss << '(' << low << ',' << high << ',' << max_value << ')'; 14 return ss.str(); 15 } 16 int low; 17 int high; 18 int max_value; 19 }; 20 21 MAX_SUBARRAY find_max_crossing_subarray(int V[], int low, int mid, int high) 22 { 23 int left_sum = INT_MIN; 24 int right_sum = INT_MIN; 25 int max_left = mid, max_right = mid + 1; 26 int sum = 0; 27 int i = 0; 28 for (i = mid; i >= low; i--) 29 { 30 sum = sum + V[i]; 31 if (sum > left_sum) 32 { 33 left_sum = sum; 34 max_left = i; 35 } 36 } 37 sum = 0; 38 for (i = mid + 1; i <= high; i++) 39 { 40 sum = sum + V[i]; 41 if (sum > right_sum) 42 { 43 right_sum = sum; 44 max_right = i; 45 } 46 } 47 return MAX_SUBARRAY(max_left, max_right, left_sum + right_sum); 48 } 49 50 MAX_SUBARRAY find_max_subarray(int V[], int low, int high) 51 { 52 if (low == high) 53 { 54 return MAX_SUBARRAY(low, high, V[low]); 55 } 56 else 57 { 58 int mid = (low + high) / 2; 59 MAX_SUBARRAY ml = find_max_subarray(V, low, mid); 60 MAX_SUBARRAY mr = find_max_subarray(V, mid + 1, high); 61 MAX_SUBARRAY mc = find_max_crossing_subarray(V, low, mid, high); 62 if (ml.max_value > mc.max_value && ml.max_value > mr.max_value) 63 { 64 return ml; 65 } 66 else if (mc.max_value > ml.max_value && mc.max_value > mr.max_value) 67 { 68 return mc; 69 } 70 else 71 { 72 return mr; 73 } 74 } 75 } 76 77 void main() 78 { 79 int A[8] = { -1, -2, -3, -4, -1, -6, -7, -8 }; 80 cout << find_max_subarray(A, 0, 7).toString() << endl; 81 82 //for (size_t i = 5; i >= 0; i--) 83 //{ 84 // cout << i << endl; 85 //} 86 getchar(); 87 }
在for循环中使用size_t类型,且循环递减时,一定要注意!
浙公网安备 33010602011771号