四種演算法實現最長連續子串行

2022-06-08 23:03:16 字數 1713 閱讀 8597

#include #include #include #include #include using namespace std;

/*產生長度為length的,元素為[-range,range)中隨機數的vector

*/vectorrandomvector(int range, int length)

/*暴力破解 o(n^3)

sum(i,j) = sum of seq[i,j]

對於每個i,j, 0 <= i <= j < seq.size()

mcss = max(mcss,sum(i,j))

*/int mcss1(vectorseq)

mcss = max(mcss, sum);

} }cout << "mcss1,inner loop cnt: " << tot << endl;

return mcss;}/*

o(n^2)演算法

暴力破解演算法有很大的時間上的浪費

考慮已經求出sum(i,j)的情況下再求sum(i,j+1)可以直接利用之前的sum(i,j)的結果加上seq[j+1],而不用重新計算

設s(i) = sum(0,i),則sum(i,j) = s(j) - s(i-1)

這裡就是利用了這一特性,記錄序列中每個i( 0 <= i < seq.size )的前i項和,去掉內層迴圈

*/int mcss2(vectorseq) ;

for (int i = 0; i < seq.size(); i++)

int mcss = seq[0];

for (int i = 1; i < s.size(); i++)

for (int j = i; j < s.size(); j++)

cout << "mcss2,inner loop cnt: " << tot << endl;

return mcss;}/*

o(nlogn)演算法

mcss3(seq,l,r) 返回在seq[l,r)中的最大連續子串行和,那麼mcss3(seq,0,seq.size)為最終答案

設m為區間中間那個數,seq1為貫穿這個區間的最大連續子串行。

mcss = max(mcss3(seq,l,m),mcss3(seq,m,r),seq1)

*/int mcss3(vectorseq,int l,int r)

int rmax = seq[m], rsum = 0;

for (int i = m; i < r; i++)

return max(max(mcss3(seq, l, m), mcss3(seq, m, r)), lmax + rmax);}/*

o(n)演算法 動態規劃

對於seq[i],它可以選擇加入前面的連續子串行,也可以選擇另開乙個子串行。

當前面的連續子串行為負數時,選擇另開乙個子串行比較好,得到乙個包含seq[i]的區域性最大連續子串行

當前面的連續子串行為正數時,加入前面的子串行比較好,同樣得到乙個包含seq[i]的區域性最大連續子串行

區域性最大子串行中最大的那個即為答案。

*/int mcss4(vectorseq)

sum += seq[i];

// sum = max(sum+seq[i],seq[i]);

mcss = max(sum, mcss);

} return mcss;

}int main()

最長連續子串行變種

在蒜廠年會上有乙個 在乙個環形的桌子上,有 n 個紙團,每個紙團上寫乙個數字,表示你可以獲得多少蒜幣。但是這個遊戲比較坑,裡面竟然有負數,表示你要支付多少蒜幣。因為這些數字都是可見的,所以大家都是不會出現的賠的情況。遊戲規則 每人只能抓一次,只能抓取一段連續的紙團,所有紙團上的數字和就是你可以獲得的...

最長連續子串行和

動態規劃 一維dp i 表示以i結尾的子陣列的最大和 以下 可以記錄子陣列的開始和結束位置 要求輸出子串行和的第乙個和最後乙個 include include 兩個輔助陣列 const int maxn 1000 int dp maxn int pre maxn 存放子串行的開始 int arr m...

演算法 最長連續序列

給定乙個未排序的整數陣列,找出最長連續序列的長度。要求演算法的時間複雜度為 o n 示例 輸入 100,4,200,1,3,2 輸出 4 解釋 最長連續序列是 1,2,3,4 它的長度為 4。找到一組數的集合,我們想一下可能有的方法,動態規劃?貌似沒有狀態轉移方程可以寫 滑動視窗?他不是連續的子陣列...