給定k個整數組成的序列,「連續子列」被定義為,其中 1≤i≤j≤k。「最大子列和」則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。
本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點如下:
輸入第1行給出正整數k (≤100000);第2行給出k個整數,其間以空格分隔。
在一行中輸出最大子列和。如果序列中所有整數皆為負數,則輸出0。
6
-2 11 -4 13 -5 -2
20
我先貼乙個main()函式,每個不同的方法printf()那裡改一下函式名即可。
#include #define maxn 100000 //本題最大資料是十萬
int main(void) ;
scanf("%d", &k);
for ( i = 0; i < k; i++ )
scanf("%d", &a[i]);
printf("%d", maxsubseqsum1( a, k )); //不同方法此處修改函式名即可。
return 0;
}
法一:三重迴圈。第一重標記子列最左端,第二重標記子列最右端,第三重由子列左端累加到子列右端。
int maxsubseqsum1 ( int a, int n ) }
return maxsum;
}
法一結果:t(n) = o(n3)
法二:二重迴圈。對於相同的子列左端位置 i ,不同的右端位置 j ,我們只要每次在右端累加一項,即可求得每乙個子列和。
int maxsubseqsum2 ( int a, int n ) }
return maxsum;
}
法二結果:雖然全部答案正確,但是資料為10萬的時候,時間有點長3748ms。t(n) = o(n2)
方法三:分而治之。
將序列從中分為左右兩個子串行。
遞迴求得兩個子列的最大和。
從中分點分頭向左、右兩邊掃瞄,找出跨過分界線的最大子列和。
輸出這三個子列和最大的乙個。
圖示:
**:
/*返回三個整數的最大值*/
int max3 ( int a, int b, int c )
/*分治法球list[left]到list[right]的最大子列和*/
int divideandconquer ( int list, int left, int right )
/* 「分」的過程 */
center = ( left + right ) / 2; //找到中分點。
maxleftsum = divideandconquer ( list, left, center ); //遞迴求左子列和。
maxrightsum = divideandconquer ( list, center+1, right ); //遞迴求右子列和。
/*求跨分界線的最大子列和*/
maxleftbordersum = 0; leftbordersum = 0;
for ( i = center; i >= left; i-- ) //左邊掃瞄結束。
maxrightbordersum = 0; rightbordersum = 0;
for ( i = center+1; i <= right; i++ ) //右邊掃瞄結束。
/*返回「治」的結果*/
return max3 ( maxleftsum, maxrightsum, maxleftbordersum + maxrightbordersum );
}/*此函式用於保持介面相同*/
int maxsubseqsum3 ( int list, int n )
法三結果:t(n) = o(nlogn)
}法四結果:t(n) = o(n). 速度最快為20ms,但是跟nlogn的23ms也差不多,看來logn真的是乙個很小的數。
求最大子列和的四種方法
includeint maxsubseqsum2 int a,int n return maxsum int main int i,n scanf d n for i 0 i int max3 int a,int b,int c int divideandconquer int list,int l...
最大子列和(C語言 4種方法)
主函式 呼叫不同的函式,更改這句就ok max maxsubseqsum4 a,n int main return maxsum int maxsubseqsum2 int a,int n return maxsum int max int a,int b,int c int divideandco...
最大子列和問題的四種演算法
給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點如下 資料1 與樣例等價,...