《資料結構》 最大子列和問題(多方案)

2021-10-02 21:36:35 字數 2435 閱讀 4568

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

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

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

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

-2  11 -4 13 -5 -2

思路:暴力美學,使用窮舉法,將輸入的正整數序列的每種情況就行對比,需要使用三重迴圈以求出最長子序列之和。

int maxsubsequm1(int a, int n)

}// 迴圈結束

return maxsum;

}

時間複雜度:思考

思路:暴力操作,使用二重迴圈,降低時間複雜度。

int maxsubsequm1(int a, int n)

}// 迴圈結束

return maxsum;

}

時間複雜度:思考

如果全部序列都為正數,即最大子列和就是其自身

如果最大子列全部為負數,那麼最大子列和就是最小的負數

所以,只有當前子列為正數時,才能使最大子列和增大。

我們可以通過拋棄負子列,保證最大子列和遞增。當掃瞄一遍,最大子列和不再遞增時,當前的最大子列和即為我們的解。

思路:分而治之,就是把乙個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。在此問題中,將乙個大的序列分為兩個小的序列,再進行分解......直到每個小序列只有乙個數值,在每個小序列中,需要求出:

1)左邊序列最大子列和(時間複雜度為t(n/2));

2)右邊序列最大子列和(時間複雜度為t(n/2));

3)橫跨左右劃分邊界的最大子列和(左邊掃瞄一遍,右邊掃瞄一遍,每個數值只掃瞄了一遍,時間複雜度為o(n));

求出之後其中最大值就是最大子串行和。

/* 下面是"分"的過程 */

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;

}

時間複雜度思考:

思路:動態規劃,狀態轉移方程為:maxsum[i] = max;對於最大連續子列和來說,往往是有兩種情況,一種是一直相加,中間某一過程中最大,另一種是重新開始的子列和最大。maxsum[i] 表示前i個最大連續子列和。時間複雜度為o(n)

int dp(int a,int n)

return maxsum;

}

資料結構 最大子列和問題

最大子列和問題 20 分 給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點...

資料結構 求最大子列和

陳越姥姥已經講得很好了 傳送門,我只做記錄方便回顧。四種演算法 1.暴力,演算法複雜度 o n 3 2.暴力,演算法複雜度 o n 2 3.分治法 遞迴 演算法複雜度 o nlogn 4.及時處理,演算法複雜度 o n includeint a 100000 int whoismax int i,i...

最大子列和問題 資料結構測試1 1

給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。輸入格式 輸入第1行給出正整數 k 100000 第2行給出k個整數,其間以空格分隔。輸出格式...