最大子列和問題的四種演算法

2021-09-25 10:29:47 字數 1789 閱讀 8501

給定k個整數組成的序列,「連續子列」被定義為,其中 1≤i≤j≤k。「最大子列和」則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。

本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點如下:

資料1:與樣例等價,測試基本正確性;

資料2:102個隨機整數;

資料3:103個隨機整數;

資料4:104個隨機整數;

資料5:105個隨機整數;

輸入格式:

輸入第1行給出正整數k (≤100000);第2行給出k個整數,其間以空格分隔。

輸出格式:

在一行中輸出最大子列和。如果序列中所有整數皆為負數,則輸出0。

輸入樣例:

6-2 11 -4 13 -5 -2

輸出樣例:

20利用三個for迴圈巢狀,把所有子列和計算一遍。複雜度t(n) = o(n3)

int maxsubseqsum1(int a,int n)

if( thissum > maxsum )

maxsum = thissum;//thissum更大就更新,否則捨去繼續讀後面的數

}//j迴圈結束

}//i迴圈結束

return maxsum;

}

在演算法1的基礎上,去掉第三層for迴圈,用thissum += a[j]替換,對於相同的i,不同的j,在j-1次迴圈中比較maxsum和thissum即可。複雜度t(n) = o(n2)

int maxsubseqsum2(int a,int n)//演算法2

//j迴圈結束

}//i迴圈結束

return maxsum;

}

將數列一分為二,左右遞迴計算,max。複雜度t(n) = o(n logn)

int max3( int a, int b, int c ) 

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 )

int maxsubseqsum4(int a,int n)//形參是陣列和元素個數 

return maxsum;

}

求最大子列和的四種演算法

問題描述 有乙個陣列有正有負,問起最大的連續子列的和是多少。求最大子列和 a1,a2,a3.an 方法1,暴力搜尋 int maxsubseqsum1 int a,int n return max int maxsubseqsum2 int a,int n return max 分治法 int ma...

最大子串行和的四種演算法

1.窮舉法 演算法思想 算出每個子串行的和,即算出序列中第i個到第j個數的和 j i 並進行比較 演算法 public static int maxsubsum1 int a if sum maxsum return maxsum 執行時間為o n 3 2.對上述第乙個演算法的改進 演算法思想 第乙...

最大子串行和的四種演算法

算出每個子串行的和,即算出序列中第i個到第j個數的和 j i 並進行比較。執行時間為o n 3 maxsum 0 nums d n int input 輸入陣列長度 for i in range 0 n k int input 輸入資料 for i in range 0 len nums for j...