自己編的求最大子段和算法C++代碼

自己編的求最大子段和方法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;
}

注:這種方法是我無意間想出來的,能力有限,不會證明,故不敢稱其爲算法;這個想法想必前人已經提出來過,其正確性或許已被證明,博主才疏學淺,不得知。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章