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

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

sin code 收獲 一行 ret 個數 第三章 動態規劃 一個

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;
}

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