如有不對 不吝賜教
給定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 ...