最大連續和的四種解法

2021-07-26 08:22:56 字數 964 閱讀 7781

最大連續和問題:

給出乙個長度為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+a2+...+ai,則ai+a(i+1)+...aj=sj-s(i-1)。

可據此求解本題,tn=o(n^2)。

*/a[0]=s[0]=0;

int maxn=a[1];

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

s[i]=s[i-1]+a[i];

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

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

if(s[j]-s[i-1]>maxn)

maxn=s[j]-s[i-1];

解法3:

*

分治法。

分治演算法一般分為3個步驟:

1.劃分問題:把問題的例項劃分為子問題。

2.遞迴求解:遞迴解決子問題。

3.合併問題:合併子問題的解得到原問題的解。

本題中,「劃分」就是把序列分成元素個數盡量相等的兩半;「遞迴求解」就是分別求出完全位於左半或

完全位於右半的最佳序列;「合併」就是求出起點位於左半、終點位於右半的最大連續和序列,並和子問題

的最優解比較。

*/ int get_maxn(int *a,int begin,int end)

int ans=a[1];

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

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

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

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

四種方法解決最大連續子串行和問題

問題描述 給定乙個序列 整數或浮點數 求出其中連續的子串行和最大的那乙個。例 序列,其最大的連續子串行為或,最大和為10.最最普通的方法,效率十分低,一般不會用到,這裡簡單介紹。直接兩個for迴圈枚舉子序列的首尾,再來乙個for迴圈計算首尾之間的序列和,計算所有的序列和,找到最大值。時間複雜度 o ...

最大連續子串行和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 令...