演算法設計 最大子段和問題 動態規劃

2021-10-04 14:07:34 字數 925 閱讀 6129

演算法設計--最大子段和問題--動態規劃

問題:給定有n個整數(包含負整數)組成的序列a1,a2,a3,......,an,求該序列子段和的最大值。

注意:當所有整數均為負值時,定義其最大欄位和為0;

由bj的定義(bj是1到j位置的最大子段和:)易知,當bj-1>0時bj=bj-1+aj,否則bj=aj。

則計算bj的動態規劃遞迴式: bj=max,1≤j≤n。12

3456

a[i]

-211

-413

-5-2

b(初值=0)

-211720

1513

sum0

1111

2020

20

#define num 1001

int a[num];

int maxsum(int n)

return sum;

}

令besti,bestj為最大子段和sum的起始位置和結束位置; 在當前位置i,如果b[i-1] ≤0時,在取b[i]=a[i] 的同時, 儲存該位置i到變數begin中,顯然: 當b(i-1)≤0時,begin=i; 當b(i)≥sum時,besti=begin,bestj=i。

#includeusing namespace std;

#define num 1001

int a[num];

int maxsum(int n,int &besti,int &bestj)

if(b>sum)

}return sum;

}int main()

int besti=0,bestj=0;

int sum=0;

sum=maxsum(8,besti,bestj);

cout

動態規劃 最大子段和問題

問題 給定n個整數 可以為負數 的序列 a1 a2 an 求其最大子段和 連續的某個子串 分析 蠻力法的話,o n2 分治法,將序列分為左右兩部分分別求最大子段和,從分界點開始向兩邊分別找最大子段和再合併,取最大即可。複雜度遞推式 t n 2t n 2 o n o nlogn 動態規劃,最優子結構的...

動態規劃 最大子段和

給定乙個陣列a a0,a1,a2,an 求陣列中 連續子段之和 的最大值。1 最簡單的演算法 窮舉法 計算所有的連續子段之和,得出最大值 窮舉法 計算所有的子串行和 o n 3 public static int maxsum1 int data max tmp max tmp max return...

動態規劃 最大子段和

題目描述 給出一段序列,選出其中連續且非空的一段使得這段和最大。輸入輸出格式 輸入格式 第一行是乙個正整數nn,表示了序列的長度。第二行包含n個絕對值不大於10000的整數a i,描述了這段序列。輸出格式 乙個整數,為最大的子段和是多少。子段的最小長度為1。輸入輸出樣例 輸入樣例 1 72 4 3 ...