PTA 資料結構與演算法 7 1 最大子列和問題

2021-09-20 10:36:58 字數 1728 閱讀 9561

如有不對 不吝賜教

給定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這道題目使用二分法,在我們的印象中,二分法經常指二分搜尋,但是其實二分法基本上適用於許多序列的搜尋問題(不僅僅只是搜尋乙個值,像這道題就是搜尋序列的值)

下面進入這道題目的分析:

這道題要求出最大的子串行和,那麼利用二分的思想,我們將乙個完整的序列以mid為界,分為左右兩個序列,那麼顯然最大的子串行和只用三種情況:

1.在左邊的序列中

2.在右邊的序列中

3.通過分界點(即mid)的序列

那麼乙個序列的最大子串行和就在這三者中選出最大值就行了,我們發現乙個序列分為左右兩個序列之後,還可以對兩個子串行繼續使用二分的方法,這樣就可以使用遞迴來解決。

下面上**

#include

long

max(

long a,

long b,

long c)

;long

getmax

(int left,

int right,

int*number)

;int

main

(void

)long

max(

long a,

long b,

long c)

long

getmax

(int left,

int right,

int*number)

long max=

0,curmax=0;

int mid=

(left+right)

>>1;

//取中

int i;

for(i=mid;i>=left;i--

) max=curmax;

//變回最大值

for(i=mid+

1;i<=right;i++

)//從終點開始向兩邊搜尋

max=

max(curmax,

getmax

(left,mid,number)

,getmax

(mid+

1,right,number));

return max;

}

測試結果

當然,這道題還可以用滑動視窗來解決。

資料結構與演算法題目集(中文)7 1 最大子列和問題

題目鏈結 7 1 最大子列和問題 輸入樣例 6 2 11 413 5 2 輸出樣例 20解題思路dp入門題 做完這道題可以去看一下洛谷上的傳送門 p1115 最大子段和,跟這道題一模一樣 附上 include define int long long define lowbit x x x usin...

資料結構與演算法 最大子序和

在這裡插入描述 動態規劃 設定乙個陣列adds儲存以所給陣列中以每個資料為結尾的最大陣列序的和,具體找法是,從左向右開始,若前半部分資料和大於0,則加上,若小於則捨去,最後在迴圈在adds中的最大值。int len nums.size int adds len adds 0 nums 0 for i...

資料結構與演算法 最大子列和問題

問題 給定n個整數序列,求該序列中存在的最大的連續n個整數和。分析 方法1 最自然的方法是設定子列和的左端索引i和右端索引j,然後通過遍歷的方法找出最大的子列和,其中最簡單的陣列求和也是遍歷相加,因此將會有三層迴圈,計算複雜度為o n 3 為 int maxsum1 int a,int n int ...