日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

分治法求最大子数组

發(fā)布時(shí)間:2024/8/24 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 分治法求最大子数组 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?1?/**
?2??*分治法求最大子數(shù)組
?3??*yaoC?2014-09-06
?4??*Θ(nlg(n))
?5??*/
?6?
?7?#include<iostream>
?8?using?namespace?std;
?9?
10?#define?neg_infinity?-999999
11?
12?//一個(gè)子數(shù)組的開始下標(biāo),結(jié)束下標(biāo)和值的和
13?struct?indices_and_value
14?{
15?????int?left;
16?????int?right;
17?????int?value;
18?};
19?
20?/**
21??*?[findMaxCrossingSubarray?找到跨越中點(diǎn)的最大子數(shù)組]
22??*?@param??A?????[輸入數(shù)組]
23??*?@param??low???[數(shù)組開始下標(biāo)]
24??*?@param??mid???[數(shù)組中間下標(biāo)]
25??*?@param??heigh?[數(shù)組結(jié)束下標(biāo)]
26??*?@return???????[所求子數(shù)組的開始結(jié)束下標(biāo)、值的和]
27??*/
28?indices_and_value?findMaxCrossingSubarray(int*?A,?int?low,?int?mid,?int?heigh)
29?{
30?????int?sum?=?0;
31?????int?left_sum?=?neg_infinity;//最大子數(shù)組在中點(diǎn)左邊的值的和
32?????indices_and_value?p;
33?????for?(int?i?=?mid;?i?>=?low;?i--)
34?????{
35?????????sum?+=?A[i];
36?????????if?(sum>left_sum)
37?????????{
38?????????????left_sum?=?sum;
39?????????????p.left?=?i;
40?????????}
41?????}
42?????sum?=?0;
43?????int?right_sum?=?neg_infinity;//最大子數(shù)組在中點(diǎn)右邊的值的和
44?????for?(int?i?=?mid?+?1;?i?<=?heigh;?i++)
45?????{
46?????????sum?+=?A[i];
47?????????if?(sum>right_sum)
48?????????{
49?????????????right_sum?=?sum;
50?????????????p.right?=?i;
51?????????}
52?????}
53?????p.value?=?left_sum?+?right_sum;
54?????return?p;
55?}
56?
57?/**
58??*?[findMaxSubarray?找到非跨越中點(diǎn)的最大子數(shù)組]
59??*?@param??A?????[輸入數(shù)組]
60??*?@param??low???[數(shù)組開始下標(biāo)]
61??*?@param??heigh?[數(shù)組結(jié)束下標(biāo)]
62??*?@return???????[所求子數(shù)組的開始結(jié)束下標(biāo)、值的和]
63??*/
64?indices_and_value?findMaxSubarray(int*?A,?int?low,?int?heigh)
65?{
66?????int?mid?=?(low?+?heigh)?/?2;//數(shù)組中點(diǎn)
67?????indices_and_value?p;
68?????if?(low?==?heigh)//base?case:only?one?element
69?????{
70?????????p.left?=?low;
71?????????p.right?=?low;
72?????????p.value?=?A[low];
73?????}
74?????else//recursive?case
75?????{
76?????????indices_and_value?left?=?findMaxSubarray(A,?low,?mid);
77?????????indices_and_value?cross?=?findMaxCrossingSubarray(A,low,mid,heigh);
78?????????indices_and_value?right?=?findMaxSubarray(A,mid?+?1,heigh);
79?????????if?(left.value>cross.value)
80?????????????p?=?left;
81?????????else
82?????????{
83?????????????if?(right.value>cross.value)
84?????????????????p?=?right;
85?????????????else?p?=?cross;
86?????????}
87?????}
88?????return?p;
89?}
90?
91?int?main()
92?{
93?????int?test[]?=?{?0,?13,?-3,?-25,?20,?-3,?-16,?-23,?18,?20,?-7,?12,?-5,?-22,?15,?-4,?7?};
94?????indices_and_value?p;
95?????p?=?findMaxSubarray(test,?0,?16);//(8,11,43)
96?????cout?<<"("<<?p.left?<<?","?<<?p.right?<<?","?<<?p.value?<<")"<<?endl;
97?}

轉(zhuǎn)載于:https://www.cnblogs.com/yaoC/p/3959515.html

總結(jié)

以上是生活随笔為你收集整理的分治法求最大子数组的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。