自己編的求最大子段和方法C++代碼
對數組arr[n]分別進行正向和反向累加求和,並求兩過程的最大值sum1和sum2,並記錄最大時的下標,正向爲記爲a,逆向記爲b,則arr[b]至arr[a]的和即爲所求。
其算法複雜度爲O(2n),高於動態規劃法,低於蠻力法。
#include <iostream>
#include <stdlib.h>
using namespace std;
int *maxSum(int a[], int len){
int sum = 0;
int max = a[0];
int i, *index;
index = (int *)malloc(sizeof(int)*3); //申請空間
for(i=0; i<len; i++){ //從a[0]開始累加,找sum最大情況
sum+=a[i];
if(max<sum){
max=sum;
index[1] = i; //最大字段的右端下標
}
}
max = a[len-1];
for(i=len-1; i>=0; i--){ //從a[i]倒序累加,找sum最大情況
sum+=a[i];
if(max<sum){
max=sum;
index[2] = i; //最大字段的左端下標
}
}
max = 0;
//cout << "index[1]:" << index[1] << endl << "index[2]:" << index[2] << endl;
for(i=index[2]; i<=index[1]; i++)
max+=a[i]; //最大子段和
for(i=index[2]; i<=index[1]; i++){
if(max<sum){
cout << "一次求解失敗,需要遞歸求解" << endl;
return 0;
}
index[0] = max;
}
return index;
}
int main()
{
int a[6] = {-20, 11, -4, 13, -5, -2};
int *max;
max = maxSum(a, 6);
Q
cout << "最大子段和是:" << max[0] << endl;
cout << "Start:" << max[2]+1 << endl;
cout << "End:" << max[1]+1 << endl;
return 0;
}
注:這種方法是我無意間想出來的,能力有限,不會證明,故不敢稱其爲算法;這個想法想必前人已經提出來過,其正確性或許已被證明,博主才疏學淺,不得知。