7-1 最大子列和問題 (20分)
給定k個整數組成的序列,「連續子列」被定義為,其中 1≤i≤j≤k。「最大子列和」則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。
本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試資料特點如下:
輸入格式:
輸入第1行給出正整數k (≤100000);第2行給出k個整數,其間以空格分隔。
輸出格式:
在一行中輸出最大子列和。如果序列中所有整數皆為負數,則輸出0。
輸入樣例:
6 -2 11 -4 13 -5 -2
輸出樣例:
20
採用分治法,將原問題分成相同結構的子問題,進行遞迴求出最佳答案,再將子問題的解合併,得到原問題的答案。
本道題當中將序列從中間分開,分成左半邊序列和右半邊序列。遞迴計算左段最大子段和leftmax,右段最大子段和rightmax。
s1為左邊left至middle的最大和,從middle開始逐個往左累加,重新整理最大和;s2為middle+1至right邊界的最大和,從middle+1開始逐個往右累加,重新整理最大和;s3為橫跨左右兩段的最大和。
最後比較以上三個資料,取最大值作為最大子段和
分治法 計算左右兩邊的子段最大值再合併時間複雜度 o(nlogn)
分治法:拆分問題 把原規模為n的問題以middle為中心 拆分成兩部分 t(n)= o(1);求解子問題:從middle開始往left累加,得到最大和:時間為o(n),右半邊也是o(n)合併子問題:t(n)= 2t(n/2)+ o(n)。通過計算得出:t(n)= o(nlogn)
本次程式設計在考慮情況方面沒有全面,只考慮了最大值是橫跨左右的,沒有考慮到只存在於左端或者右端的情況,再加上pta上給的測試資料和測試點的問題,我們**能夠過,但是其實是不對的。希望在之後的程式設計中考慮完整的情況。
演算法第二章上機實踐報告
實踐題目名稱 找第k個小的數 問題描述 設計乙個平均時間為o n 的演算法,在n 1 n 1000 個無序的整數中找出第k小的數。演算法描述 就是先假設a left 為這個分界值x,然後排序。比較x是不是第k個如果是,返回這個值。如果不是比較一下x和a k 的大小,如果xa k 遞迴在x的右邊找 演...
演算法第二章上機實踐報告
1,實踐題目名稱 最大子列和問題 給定k個整數組成的序列,連續子列 被定義為,其中 1 i j k。最大子列和 則被定義為所有連續子列元素的和中最大者。例如給定序列,其連續子列有最大的和20。現要求你編寫程式,計算給定整數序列的最大子列和。本題旨在測試各種不同的演算法在各種資料情況下的表現。各組測試...
演算法第二章上機實踐報告
1.實踐題目 7 2 改寫二分搜尋演算法 20 分 設a 0 n 1 是已排好序的陣列,請改寫二分搜尋演算法,使得當x不在陣列中時,返回小於x的最大元素位置i和大於x的最小元素位置j。當搜尋元素在陣列中時,i和j相同,均為x在陣列中的位置。輸入有兩行 第一行是n值和x值 第二行是n個不相同的整數組成...