題目:
參考:
解法:1.窮舉法:
即求x[0..n-1]中x[i...j]的之和的最大值,使用最普通的方法計算出任何x[i,j]之間各個和的最大值,然後取最大值。
經過兩次迴圈,實際複雜度:o(n^2);
2.分治法:
將原始向量x分為兩個大小近似相等的子向量a和b,然後遞迴地找出a,b中元素總和最大的子向量ma和mb。還有一種情況是最大子串行和在a和b之間,這個跨邊界的最大子向量記為mc,通過觀察可以發現:mc在a中的部分是a中包含右邊界的最大子向量,同時mc在b中的部分是b中包含左邊界的最大子向量。
時間複雜度:o(n*logn)
3.dp:
例如:
$arr = array(13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7);
下面這張表說明了計算過程:
index
max_sum113
2103-15 --> 0420
51761
7-22 --> 0
8(start)
18 9
3810
3111(end)
43 最大值
1238
1316
1431
1527
1634
時間複雜度o(n)
php實現:
<?php
/** * @author:wusuopubupt
* @date:2013-10-16
* @return mixed $max:the sum of miximum subarray
* @from:clrs 4.1 the miximum subarray problem
* * find the miximum subarray
* * */
$arr = array(13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7);
function max_sub_arr($arr)
$max = max($max,$max_sum);
if($max_sum == $max)
echo"i:$i arr[$i]:$arr[$i] max_sum:$max_sum max:$max";echo"
"; }
for($j = $start; $j <= $end; $j++)
return $max;
}?>
列印輸出:
最大子矩陣問題 dp
e acmer 題意 給你乙個矩陣,求它的所有元素和最大的子矩陣.分析 我們只知道一維的情況就是經典的最大子段和.然而維數達到二維就變的複雜了.我們觀察資料範圍500,易想到n3 的演算法也能過.純暴力是n4 的方法 然後可以通過列舉其中一維,dp最後一維的方法求出.處理列上的和為字首和,然後列舉列...
最大子陣列問題
顧名思義,最大子陣列問題是求乙個陣列array中 和最大的非空連續子陣列 這樣的連續子陣列我們叫做最大子陣列,它的應用也有 很多,比如說找出時間序列中兩個時間節點使得這兩個時間節點對應的值的落差最大,如下圖 對於這類問題,通過求原始時間序列的一階差分得到序列array,此時求得array的最大子陣列...
最大子陣列問題
include include include typedef struct num num extern void displayarray const int a,const int n 顯示陣列元素值 extern void buildarray int a,const int n 陣列元素賦...