數據結構之---求最大字段和, 時間復雜度o(n)算法

問題描述

采用動態規劃策略設計并實現算法,求解最大子段和及最大子段和的起始下標和終止下標,要求算法的時間復雜性不超過O(n)。

最大子段和問題

給定由n個整數(可能為負整數)組成的序列a1, a2,…, an, 求該序列形如 的子段和的最大值。當所有整數均為負整數時定義其最大子段和為0。依次定義,所求的最優值為

例如

當(a1,a2, a3, a4,a5,a6)= (-2,11,-4,13,-5,-2)時,最大子段和為 = 20,起始下標為2,終止下標為4。

下面這個程序時間復雜度極低為o(n)

#include<iostream>

using namespace std;

int MaxSum(int n, int a[], int &l, int &r)
{
    int sum=0, b=0, i=0, bestI=0, bestJ=0;
    for(int j = 1; j <= n; j++)
    {
        if(b > 0)
        {
            b += a[j];
        }
        else
        {
            b = a[j]; i = j;
        }

        if(b > sum)
        {
            sum = b; bestI = i; bestJ = j;
        }
    }
    l = bestI;
    r = bestJ;
    return sum;

}

int main()
{
    int flag[10] = {-2, 11, -4, 13, -5, 2};
    //int flag[10] = {-7, 11, -4, -13, -5, -2};
    int besti, bestj, sum;
    sum = MaxSum(6, flag, besti, bestj);
    cout<<"最大子段和: "<<sum<<endl;
    cout<<"初始下標:  "<<besti<<endl;
    cout<<"最終下標:  "<<bestj<<endl;
}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容