求最大連續和的解法(4種)

2021-10-02 15:19:33 字數 1247 閱讀 7480

列舉法:我們通過乙個乙個列舉長度之和來求解,例如序列列舉的情況有:

(1)(1,-2)(1,-2,1)(-2)(-2,1)(1)通過三個迴圈來列舉這些情況

int sum=0,a[10]=;

for(int i=1;i<=n;i++)//列舉每乙個數

for(int j=i;j<=n;j++)

時間複雜度:o(n^3)

2:遞推:(對1的優化)

定義s[i]為前i項和

int s[0]=0;

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)

for(int j=i;j<=n;j++)

ans=max(ans,s[j]-s[i-1]);

3:分治法

將原問題分解成子問題,我們將序列分成[1,m],[m+1,r],m=(l+r)/2,情況有3種

1:最大子串行和在左區間

2:最大子串行和在右區間

3:最大子串行在中間(1=思路:對於1,2我們之間求和就好了,而3就是1+2(遞迴來解)

#includeusing namespace std;

int a[200005],n;

const int minx=-999999999;

int max(int a,int b)

int fun(int l,int r)

sum=0;

for(int j=m+1;j<=r;j++)

return max(max(fun(l,m),fun(m+1,r)),ansl+ansr); }

int main()

4:貪心法

我們用sum積累和,當sum<=0時,我們就不需要前面的數了(後面的數肯定希望前面的數是正數,所以到後面就不選前面的負數了)直接一直積累過去

#includeusing namespace std;

int main()

printf("%d",ans);

return 0;

}

這個方法能夠ac洛谷的那道題(小聲bb)

另外我們在求解時也可能會遇到有環的存在,具體做法就是陣列開成2*n

想做的可以試試:傳送門(2019藍橋杯模擬賽蒜廠年會)(這道題用貪心只能過8/10個樣例)

後序更新(題解)=^=!

更新:蒜廠年會題解

三種解法求 最大連續子串行的和

示例 輸入 2,1,3,4,1,2,1,5,4 輸出 6 解釋 連續子陣列 4,1,2,1 的和最大,為 6。假設a l a r 的和為 sum 如果 sum 0,則說明 sum 對結果有增益效果,則 sum 保留 如果 sum 0,則說明 sum 對結果無增益效果,需要捨棄 明白了這個道理,那麼對...

最大連續和的四種解法

最大連續和問題 給出乙個長度為n的序列a1,a2,a3,an,求最大連續和。即 找到1 i j n,使ai a i 1 an盡量大 解法1 列舉所有連續子串行,tn o n 3 int maxn a 1 for int i 1 i n i for int j i j n j 解法2 定義si a1 ...

最大連續子串行和DP解法

給定乙個數字序列a1,a2,an,求i,j 1 i j n 使得ai aj最大,輸出這個最大和 暴力方法 列舉i和j的所有可能性,複雜度o n2 並且o n2 次計算ai aj,總體複雜度為o n3 就算我們採取字首和的方法,將計算複雜度降為o 1 複雜度o n2 仍然難以讓我們接受 step1 令...