【實踐報告】算法第三章實踐報告
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;
}
【實踐報告】算法第三章實踐報告