#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。找到一組數的集合,我們想一下可能有的方法,動態規劃?貌似沒有狀態轉移方程可以寫 滑動視窗?他不是連續的子陣列...