列舉法:我們通過乙個乙個列舉長度之和來求解,例如序列列舉的情況有:
(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 令...