給定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...