演算法第二章上機實踐報告

2022-08-21 04:54:10 字數 1456 閱讀 7212

我選擇的題目是:最大子列和問題。

7-1 最大子列和問題 (20分)

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

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

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

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

6

-2 11 -4 13 -5 -2

20
**如下:

#include using

namespace

std;

int maxsum(int *a,int left,int

right)

int mid=(left+right)/2

;

int maxl=maxsum(a,left,mid);

int maxr=maxsum(a,mid+1

,right);

int sum=0

;

int lsum=0

;

int rsum=0

;

int mlsum=0

;

int mrsum=0

;

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

}for(int j=mid+1;j<=right;j++)

}sum=mlsum+mrsum;

if(maxl>sum)

if(maxr>sum)

return

sum;

}int

main()

int x=maxsum(a,0,n-1

); cout

}

演算法描述:

本演算法採用分治思想,將最大連續子列和問題分解為三個子問題:陣列左半邊的最大子列和,陣列右半邊的最大子列和以及橫跨陣列中線的最大子列和,然後利用遞迴算出三個子列和,再把三個子列和相比較,其中最大的就是本題答案,輸出即可。另外需要注意的是,若輸入全是負數則應該輸出0,本**中尚未包括,因此可以加入乙個計數器,初值設為0,若輸入有正數則將其值修改為一,否則仍為0;若此值為0,則輸出0即可。

演算法分析:

在本演算法中,子問題規模為原問題的一半,易知時間複雜度為2t(n/2),再加上從中間出發對兩邊元素的掃瞄o(n),故t(n)=2t(n/2)+o(n)=o(nlogn).

心得體會:

本次實踐讓我對分治思想有了深刻的認識,而且對遞迴演算法有了深刻的了解,首先是遞迴一開始的判斷語句,然後是分治的遞迴呼叫,相信通過這一次實驗我能夠運用好分治法解決問題。

演算法第二章上機實踐報告

實踐題目名稱 找第k個小的數 問題描述 設計乙個平均時間為o n 的演算法,在n 1 n 1000 個無序的整數中找出第k小的數。演算法描述 就是先假設a left 為這個分界值x,然後排序。比較x是不是第k個如果是,返回這個值。如果不是比較一下x和a k 的大小,如果xa k 遞迴在x的右邊找 演...

演算法第二章上機實踐報告

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

演算法第二章上機實踐報告

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