分治法解決最大子數組問題【 轉載】

最近在看《算法導論》,剛看到分治策略裏的最大子數組問題,以爲這個寫的不錯,記錄在這裏,方便本身之後複習。html

問題描述見《算法導論》P38ios

原文地址:https://www.cnblogs.com/Christal-R/p/Christal_R.html算法

代碼以下:數組

 1 // 最大子數組分治法.cpp: 定義控制檯應用程序的入口點。
 2 //
 3 
 4 #include "stdafx.h"
 5 #include <iostream>
 6 
 7 using namespace std;
 8 
 9 #define MIN -1000
10 
11 int MiddleMax(int *arry, int l, int r, int m)
12 {
13     int l_max = MIN, r_max = MIN;//分別用於記錄左、右方向累加的最大和
14     int i;
15     int sum;//用於求和
16     sum = 0;
17     for (i = m; i >= l; i--)//中線開始向左尋找
18     {
19         sum += arry[i];
20         if (sum>l_max)
21             l_max = sum;
22     }
23     sum = 0;
24     for (i = m + 1; i<r; i++)//中線開始向右尋找
25     {
26         sum += arry[i];
27         if (sum>r_max)
28             r_max = sum;
29     }
30     return (l_max + r_max);//返回左右之和
31 }
32 
33 int Divide(int *arry, int l, int r)
34 {
35     if (l == r)//只有一個元素時,返回該元素
36         return arry[l];
37     else
38     {
39         int m = (l + r) / 2;
40         int l_max = MIN, r_max = MIN, m_max = MIN;
41         l_max = Divide(arry, l, m);//左邊和的最大值
42         r_max = Divide(arry, m + 1, r);//右邊和的最大值
43         m_max = MiddleMax(arry, l, r, m);//中間和的最大值
44                                          //返回三個值中最大的一個
45         if (l_max >= r_max && l_max >= m_max)
46             return l_max;
47         else if (r_max >= l_max && r_max >= m_max)
48             return r_max;
49         else
50             return m_max;
51     }
52 }
53 
54 int main()
55 {
56     int a[] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
57     int b[] = { -1,-2,-3,-4,-5,-6,-7,-8,-9 };
58     cout << Divide(a, 0, 15) << endl;
59     return 0;
60 }

運行結果以下:ide

相關文章
相關標籤/搜索