最大子列和問題(C語言版 四種方法)

2021-08-26 20:16:01 字數 2527 閱讀 9231

給定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 與樣例等價,...