(三)最大子段和問題

2021-08-19 09:46:14 字數 2578 閱讀 1889

1.概念

求陣列的和最大的非空連續子陣列,這樣的連續的子陣列稱為最大子陣列(maximum subarray)

2.常規方法(o^3)

/* 最大子段和問題 o^3*/

#include using namespace std;

//列印陣列

void printarray(int *arr, int strat, int last)

cout << endl;

}//求最大子段和

int maxsum(int len, int *arr, int& besti, int &bestj)

if (thissum > sum)

}} return sum;

}int main()

; //陣列長度

len = sizeof(array) / sizeof(*array);

//列印原始陣列

cout << "the array is: " << endl;

printarray(array, 0, len-1);

//求最大子段和

cout << "the maxsum is: " << endl;

cout << maxsum(len, array, i, j) << endl;

//列印最大子段

cout << "the maxsumarray is: " << endl;

printarray(array, i, j);

system("pause");

return 0;}/*

the array is:

13 -3 -25 20 -3 -16 -23 18 20 -7 12 -5 -22 15 -4 7

43the maxsumarray is:

18 20 -7 12

請按任意鍵繼續. . .

*/

3.分治策略解決最大子段和問題(nlgn)

分治策略在每層遞迴時都有三個步驟:

a 分解原問題為若干子問題,這些子問題是原問題的規模較小的例項。

b 解決這些子問題,遞迴地求解各子問題。然而,若子問題的規模足夠小,則直接求解。

c 合併這些子問題的解成原問題的解。

分治策略的求解分析

假設要尋找子陣列a[low…high]的最大子陣列。使用分治策略要將子陣列劃分為兩個規模盡量相等的子陣列。先找到中間位置mid,然後考慮求解兩個子陣列a[low…mid]和a[mid+1…high]。

a[low…high]的任何連續子陣列a[i…j]所處的位置必然是以下三種情況之一:

a      完全位於子陣列a[low…mid]中,low≤i≤j≤mid。

b      完全位於子陣列a[mid+1…high],mid+1≤i≤j≤high。

c      跨越了中點,low≤i≤mid≤j≤high。

/* 分治思想下的最大子段和問題 nlgn*/

#include using namespace std;

//列印陣列

void printarray(int *arr, int strat, int last)

cout << endl;

}//尋找最大子段和

int maxsubsum(int *arr, int low, int high, int& bestl, int& bestr)

else

}//右半部分最大子段和

for (int i = mid + 1; i <= high; i++)

}sum = sl + sr;//跨越中點的最大子段和

if (sum < leftsum)

if (sum < rightsum)

}return sum; }

int main()

; //陣列長度

len = sizeof(array) / sizeof(*array);

//列印原始陣列

cout << "the array is: " << endl;

printarray(array, 0, len - 1);

//尋找最大子陣列

cout << "the maxsum is: " << endl;

cout << maxsubsum(array, 0, len - 1, l, r) << endl;

///列印最大子陣列

cout << "the maxsumarray is: " << endl;

printarray(array, l, r);

system("pause");

return 0;}/*

the array is:

13 -3 -25 20 -3 -16 -23 18 20 -7 12 -5 -22 15 -4 7

the maxsum is:

43the maxsumarray is:

18 20 -7 12

請按任意鍵繼續. . .

*/

最大子段和(三)

最大子段和問題 解法三 演算法分析 對於序列a,設j代表當前序列的終點,i代表當前序列的起點 分析 如果a i 是負的,那麼它不可能是最大子段的起點,因為任何包含a i 為起點的子段都可以通過 用a i 1 為起點而得到改進。類似的,任何負的子段都不可能是最優子段的字首 原理相同 如果在迴圈中檢測到...

最大子段和問題

給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整均為負數時定義子段和為0 分治法 分析 首先將陣列分為兩部分,最大子段和 可以在陣列的左半部分也可以在右半部分,也可以橫跨分割點,因此我們只需要用分治思想求出左邊最大...

最大子段和問題

給定n 個整數 有可能是負數 組成的序列,要求分別用蠻力法,減治法和動態規劃法,求最該序列的最大子段和,並對它們的效率進行比較分析。也稱窮舉法或列舉法,是一種簡單直接地解決問題的方法,常常基於問題的描述,所以,蠻力法也是最容易應用的方法。它依賴的基本技術是遍歷,採用一定的策略依次處理待求解問題的所有...