【演算法】第三章作業 實踐報告
【演算法】實踐第三章作業
1. 實踐題目
最大子段和
2. 問題描述
給定n個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均為負數時,定義子段和為0。
要求演算法的時間複雜度為O(n)。
3. 演算法描述
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
int i=0,n; //變數i儲存最大值
cin>>n;
int a[10000];
for(int j=1;j<=n;j++)
cin>>a[j];
for(int j=1;j<=n;j++)
{
if(a[j]+a[j+1]>a[j+1])
a[j+1]=a[j]+a[j+1]; //a[j]+a[j+1]>a[j+1],說明這兩個數都可以取,均在之後的最大欄位和中
if(a[j+1]>i)
i=a[j+1]; //儲存最大值,當均為負數是,i為0,也符合情況。
}
cout<<i;
}
4. 演算法時間及空間複雜度分析(要有分析過程)
很顯然,演算法描述中,程式碼段/*for(int j=1;j<=n;j++){}*/中,a[]為一維陣列,時間複雜度為O(n); 空間複雜度也為O(n),一維陣列中,每次的遍歷操作。
5. 心得體會(對本次實踐收穫及疑惑進行總結)
在做這一次題目中,一開始我和隊友都沒有清楚的頭緒,一開始按照上題數字三角形的思路,將a[n-1][j]=max([n][j]+a[n][j],[n][j]+a[n][j])思路類推,可是推了一遍,並不成立,然後我就考慮三個連續數作為物件看是否行得通,但是也不行,之後搭檔就提出了他自己的建議,思路可以與上一題類似,但是邏輯上應該改變一下,另外定義一個變數值