容器實現的查詢最大序列

2021-06-26 00:21:22 字數 2792 閱讀 4328

#include

#include

#include

#include

using namespace std;

int m;

vectorn;

int sum;

int main()

int maxfar = 0;//儲存最大值

for (auto i = n.begin(); i != n.end();++i)//i為最內層迴圈開始時的左邊界,因為要計算所有的序列,所以每一位都要做一次左邊界,所以i遍取x中所有的值

cout << endl;

cout << maxfar << endl;}}

//cout << maxfar;

cin >> sum;

上述**由於重複計算了所有的sum,所以所耗費的時間較多

下述**則利用了之前計算的i相同的序列,使得不需要重複計算所有的sum,所以時間複雜度得到了降低

#include#include#include#includeusing namespace std;

vectorx;

vector::iterator beg= x.begin();

vector::iterator end1 = x.end();

int m;

vectorn;

int sum;

int main()

int maxfar = 0;//儲存最大值

for (auto i = n.begin(); i != n.end(); ++i)

}//上一種寫法是重複計算了sum,而這種寫法則是利用了開始序列i相同而j增長的做法,不需要每次都要疊加所有的序列

cout << maxfar;

cin >> sum;

}

還有更快速的方法如下:
#include#include#include#includeusing namespace std;

vectorx;

vector::iterator beg= x.begin();

vector::iterator end1 = x.end();

int m;

vectorn;

int sum = 0;

int f(vector::iterator l, vector::iterator u)//這裡不能寫成i>=l,否則由於for迴圈最後一次執行的時候--i會導致容器越界而報錯,開頭的l必須要使用下面的語句進行迭代

lsum = lsum + *l;

lmax = max(lmax, lsum);

int rsum = 0;

for (auto i = mid + 1; i <=u; ++i)

return max(rmax + lmax, max(f(l, mid), f(mid + 1, u-1)));

}int main()

int maxfar = 0;//儲存最大值

maxfar = f(n.begin(), n.end()-1);

cout << maxfar;

cin >> sum;

這種方法類似於折半查詢,把序列分成2部分來計算,但是由於最大的序列有可能會橫跨2個子序列,所以最後會使用遞迴來計算橫跨2個子序列的情況,雖然最後會分跨2個子序列,但是分跨的子串行是連續的,也就是說一部分在左邊,一部分在右邊,2部分從序列的中斷部分開始向容器的begin和end增長,各自增長到最大的時候則就是2個要找的子串行,再分別和子串行中最大的不是從mid開始的序列進行比較,最大的就是要找的序列,這裡最後使用了遞迴。 

#include#include#include#includeusing namespace std;

vectorx;

vector::iterator beg= x.begin();

vector::iterator end1 = x.end();

int m;

vectorn;

int sum = 0;

int main()

int maxfar = 0;//儲存最大值

int maxend = 0;

for (auto i = n.begin(); i != n.end(); ++i)

// maxfar = f(n.begin(), n.end()-1);

cout << maxfar;

cin >> sum;

}

這裡maxend儲存的是動態的最大和,比如序列{1 1 1-4 3 6 -10},maxend在1 1 1的時候時候值為3,到-4則會放棄之前的之前的值而變成0,因為由於-4的出現導致數值為負數,只能放棄,而maxfar在-4的時候則會比較3和0的大小,而繼續取3,也就是說maxfar取的是到現在為止的最大值,而maxend則是每乙個區域的最大值,比如由於-4的阻斷,使得maxend放棄了之前儲存的最大值,而重新開始計算,在3的時候,maxend=3,而maxfar這個時候也是3,所以不變,而當迭代器移動到6的時候,則maxend變成了9,而maxfar這個時候則會放棄原來的3,轉而儲存現在的9,而當移動到-10的時候,maxend就又變成了0,因為9-10=-1,也就是說之前儲存的又被放棄,而又重新開始計算,而maxfar則還是9,等待下一次比9大的和的出現,這裡當maxend+*i為負數的時候maxend取0,是如果連續的負數出現,則maxend不會計算,也就是不會記憶負數,否則會對之後和造成影響。

最大序列和

輸入描述 第一行為乙個正整數n,第二行為n個整數,表示序列中的數。輸出描述 輸入可能包括多組資料,對於每一組輸入資料,僅輸出乙個數,表示最大序列和。輸入例子 5 1 5 3 2 4 61 2 3 4 10 6 4 3 1 2 5輸出例子 9 7 1 include using namespace s...

最大序列和

給出乙個整數序列s,其中有n個數,定義其中乙個非空連續子串行t中所有數的和為t的 序列和 對於s的所有非空連續子串行t,求最大的序列和。變數條件 n為正整數,n 1000000,結果序列和在範圍 2 63,2 63 1 以內。第一行為乙個正整數n,第二行為n個整數,表示序列中的數。輸入可能包括多組資...

最大序列和

給出乙個整數序列s,其中有n個數,定義其中乙個非空連續子串行t中所有數的和為t的 序列和 對於s的所有非空連續子串行t,求最大的序列和。變數條件 n為正整數,n 1000000,結果序列和在範圍 2 63,2 63 1 以內。第一行為乙個正整數n,第二行為n個整數,表示序列中的數。輸入可能包括多組資...