最大連續子串行之和演算法進化歷程

2021-07-29 11:35:43 字數 3271 閱讀 1037

/*

name:

author:

date: 23-03-17 08:08

description:

題目描述:

給定k個整數的序列,其任意連續子串行可表示為,

其中 1 <= i <= j <= k。最大連續子串行是所有連續子串行中元素和最大的乙個,

例如給定序列,其最大連續子串行為,最大和為20。

演算法1:

我們用乙個備忘錄陣列s[i]來記錄包括元素a[i]的最大連續子串行之和,

從左向右依次增大序列的規模,我們注意到,當處理元素a[i]時,若左側的連續子串行和s[i-1]>0,

則s[i]=s[i-1]+a[i]有可能是最優解; 若s[i-1]<0 ,則s[i]=a[i]有可能是最優解。

計算出所有的s[i]後,再遍歷一次陣列s[i],找出最大值。

演算法2:

基本思想和演算法1一樣,都是先記錄備忘錄陣列,再查詢最優解。

增加了乙個查詢左右邊界,並輸出對應連續子串行的功能。右邊界right即最優解s[i]的下標i;

左邊界根據left = right;

while (left > 0 && s[left-1] > 0)

來判斷。

演算法3:

也是用乙個備忘錄陣列s[i]來記錄包括元素a[i]的最大連續子串行之和,但是不是先記錄再查詢,

而是引入乙個臨時變數left,在記錄備忘錄陣列的同時,記錄最優解和左右邊界。

演算法4:

考慮到s[i]的值只與s[i-1]有關,無需把所有的s[i]都記錄下來,可以使用乙個變數代替備忘錄陣列,

用s代替s[i-1],記得每處理完乙個元素a[i],都要及時更新s的值。

基本思路同演算法3。

*/#include#includeusing namespace std;

int maxsubsequencesum_1(const int a, int n);//使用備忘錄陣列的動態規劃演算法

int maxsubsequencesum_2(const int a, int n);//先記錄備忘錄陣列,再查詢最優解和左右邊界

int maxsubsequencesum_3(const int a, int n);//記錄備忘錄陣列的同時,記錄最優解和左右邊界

int maxsubsequencesum_4(const int a, int n);//使用乙個變數代替備忘錄陣列,輸出子串行

const int max = 10;

int main(int argc, char **argv)

;

cout << maxsubsequencesum_1(a, max) << endl;

cout << maxsubsequencesum_2(a, max) << endl;

cout << maxsubsequencesum_3(a, max) << endl;

cout << maxsubsequencesum_4(a, max) << endl;

system("pause");

return 0;

}int maxsubsequencesum_1(const int a, int n)//使用備忘錄陣列的動態規劃演算法

;//s[i]用來儲存包含a[i]的最大連續子串行之和

for (int i=1; i0) //若之前的連續子串行之和大於0,則把a[i]累加上去

s[i] = s[i-1] + a[i];

else //否則重新開始

s[i] = a[i];

}

int max = s[0];

for (int i=1; imax)

max = s[i];

}

return max;

} int maxsubsequencesum_2(const int a, int n)//先記錄備忘錄陣列,再查詢最優解和左右邊界

;//s[i]用來儲存包含a[i]的最大連續子串行之和

for (int i=1; i0) //若之前的連續子串行之和大於0,則把a[i]累加上去

s[i] = s[i-1] + a[i];

else //否則重新開始

s[i] = a[i];

}

int max = s[0];

int left = 0, right = 0; //left和right分別儲存最大連續子串行的左右邊界

for (int i=1; imax)

}left = right; //尋找左邊界

while (left > 0 && s[left-1] > 0)

cout << "a[" << left << ":" << right << "] : ";

for (int i=left; i<=right; i++)//儲存各連續子串行的最大和

cout << "= ";

return max;

} int maxsubsequencesum_3(const int a, int n)//記錄備忘錄陣列的同時,記錄最優解和左右邊界

;//s[i]用來儲存包含a[i]的最大連續子串行之和

int max = s[0];

int left = 0, mleft = 0, right = 0; //mleft和right分別儲存最大連續子串行的左右邊界

for (int i=1; i0) //若之前的連續子串行之和大於0,則把a[i]累加上去

}else //否則重新開始

}

cout << "a[" << mleft << ":" << right << "] : ";

for (int i=mleft; i<=right; i++)//儲存各連續子串行的最大和

cout << "= ";

return max;

} int maxsubsequencesum_4(const int a, int n)//使用乙個變數代替備忘錄陣列,輸出子串行

} else //否則重新開始

}

cout << "a[" << mleft << ":" << right << "] : ";

for (int i=mleft; i<=right; i++)//儲存各連續子串行的最大和

cout << "= ";

return max;

}

最大連續子串行之和,最大連續子串行乘積

最大連續子串行之和問題描述為 陣列中里有正數也有負數,連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和,求所有子陣列的和的最大值。分析,對陣列a進行一遍掃瞄,sum i 為前i個元素中,包含第i個元素且和最大的連續子陣列,maxsum儲存當前子陣列中最大和,對於a i 1 來說,sum i ...

最大連續子串行之和

窮舉法思路 1,3,4,5最大子串行為4 5 9,4 2 3 5 最大子串行為4 2 3 5 10 窮舉數列的每個區間,將區間內的數相加,更新最大值,每計算乙個區間後求和的sum要清0 include main sum 0 進入下次計算sum清0 printf d max 非列舉思路 當輸入的數全為...

最大連續子串行之和

問題描述 leyni得到了乙個長度為n的序列,xiange要求leyni最多可以修改其中k個元素,每次修改的規則是只能將乙個數字修改為其相反數。leyni想知道在修改後,他能得到的所有長度為len的連續子串行中,最大的 子串行和的絕對值 為多少?input 輸入包含多組測試資料。對於每組測試資料 第...