最大連續和問題:
給出乙個長度為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 令...