用分治法解最大子数组问题
 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类型,且循环递减时,一定要注意!

posted on 2014-09-27 15:53  Zolman  阅读(201)  评论(0)    收藏  举报