1. 程式人生 > >【實踐報告】演算法第三章實踐報告

【實踐報告】演算法第三章實踐報告

 

1.實踐題目

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

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

2.問題描述

輸入格式:

輸入有兩行:

第一行是n值(1<=n<=10000);

第二行是n個整數。

輸出格式:

輸出最大子段和。

輸入樣例:

在這裡給出一組輸入。例如:

6
-2 11 -4 13 -5 -2

輸出樣例:

在這裡給出相應的輸出。例如:

20

3.演算法描述

經過討論,我們小組決定採用的是動態規劃的解法來解決這一個題目,我們建立了一個數組來存放從初始位置到各位的最大子段和,通過比較最大子段和得出的兩種方式,取其大者,並將這個最大子段和與目前的最大子段和比較,記錄下最大的,最終得出整段數列的最大子段和。

 

4.演算法時間及空間複雜度分析

時間複雜度:由於程式碼中沒有二重迴圈,至多隻要一重迴圈,所以這個演算法的時間複雜度是O(N)級別的。

空間複雜度:

5.心得體會(對本次實踐收穫及疑惑進行總結)

對於動態規劃類的題目,做法比較明確,但是難點是寫出遞迴表示式,這個十分考驗做題者的思維能力,還需要在不斷做題才能一步一步提升,不然還是沒辦法做好這倆演算法題。

ps:附上程式碼

#include<iostream>
using namespace std;
int main(){
int n,maxn;
int a[10005];
int b[10005];
cin>>n;
if(n<0||n>10000)return 0;

for (int i=1;i<=n;i++)
cin>>a[i];
maxn=b[1]=a[1];
for(int j=1;j<=n;j++){
if (maxn<0) maxn=b[j]=0;
b[j+1]=b[j]+a[j+1];
if(b[j+1]<0) {
j++;
b[j+1]=a[j+1];
}
maxn=max(maxn,b[j+1]);
}
cout<<maxn;
return 0;
}