利用分治法求解最大連續子陣列問題:
1、將陣列均分兩段,遞迴分治。
2、對於每層分治,最大子陣列要麼出現在左段或者右段,要麼出現在包含中點的連續陣列中,從中點出發向左右遍歷求最大陣列。
3、每層最大子陣列為左段最大子陣列,右段最大子陣列及包含中點的最大子陣列的最大值。
**如下:
#include #include #include using namespace std;
/* * name : find max subarray
* author : sangoly
* o(nlgn)
* date : 2014/4/18
*/ class maxsubarrayinfo
int maxleftindex;
int maxrightindex;
int maxsum;
bool operator>=(const maxsubarrayinfo& info)
bool operator==(const maxsubarrayinfo& info)
bool operator<(const maxsubarrayinfo& info)
};maxsubarrayinfo& findmaxcrossingsubarray(int array, int left, int middle, int right)
}int rightmaxsum = min;
int rightsum = 0;
int rightmaxindex = middle + 1;
for (int i=middle+1; i<=right; i++)
}maxsubarrayinfo *ret = new maxsubarrayinfo(leftmaxindex, rightmaxindex, leftmaxsum+rightmaxsum);
return *ret;
}maxsubarrayinfo& findmaxsubarray(int array, int left, int right)
else
}int main(int argc, const char **argv)
; maxsubarrayinfo result = findmaxsubarray(a, 0, 15);
cout<<"one max subarray info(index from 0) :" << endl;
cout<<"left index : " <
利用分治法求解最大子陣列和
乙個陣列的最大子陣列和可能存在於三種情況中 1.該陣列的左子陣列中 2.該陣列的右子陣列中 3.可能橫跨左右子陣列 所以,我們可以將問題分解成乙個個的子問題,其中情況1和2可用遞迴求解,而情況3則需要計算 s1 max 1 i n 2 s2 max n 2 1 j n 其中情況3中s1必然包含了 s...
分治法求最大子串
最近在學分治法,涉及到很多問題都能用分治法解決,漢諾塔,快排,歸併排序等,下面是解決最大字串問題。1,用分治法解決,下面還介紹不用分治解決的另一種方法。include 分治法 int countstring int a,int start,int end void main int v counts...
分治策略 求最大子陣列
只有當陣列中包含負數時,最大子陣列問題才有意義。如果所有元素都是非負的,最大子陣列問題沒有任何意義,因為整個陣列和肯定是最大的 1 public class findmaxsubarraydemo 4int result arr findmaximumsubarray arr,0,arr.lengt...