1. 程式人生 > >算法第三章上機實踐報告

算法第三章上機實踐報告

隊友 ace i++ pac 要求 全部 表示 報告 實踐

1、實踐題目:

最大子段和

2,問題描述:

給定n個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均為負數時,定義子段和為0。

要求算法的時間復雜度為O(n)。

3、算法描述:

定義兩個數組a,b,a表示要輸入的序列,b表示序列的子段和(比如b[3]表示a[1],a[2],a[3]的最大子段和),然後進行判斷,如果前面的最大子段和大於0,則加上改最大子段和,若前面的最大子段和小於0,則不加,最後在判斷該序列是否全部為負數,若是則輸出0,若不是,則輸出b[i]。

4、空間復雜度分析:

空間復雜度為O(n)。

5、代碼描述:

#include <iostream>;
using namespace std;

int a[10000],b[10000];
int num=0;
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){
b[i]=max(a[i],b[i-1]+a[i]);
num=max(num,b[i]);
}
cout<<num;
return 0;
}

6、心得體會:

該題運用動態規劃的思想解題,而且不會太難理解,與隊友做完這道題後,感覺對自己理解動態規劃的思想有所幫助。

算法第三章上機實踐報告