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