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

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

【演算法】實踐第三章作業

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[]為一維陣列,時間複雜度為On;  空間複雜度也為On),一維陣列中,每次的遍歷操作。

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

在做這一次題目中,一開始我和隊友都沒有清楚的頭緒,一開始按照上題數字三角形的思路,將a[n-1][j]=max([n][j]+a[n][j],[n][j]+a[n][j])思路類推,可是推了一遍,並不成立,然後我就考慮三個連續數作為物件看是否行得通,但是也不行,之後搭檔就提出了他自己的建議,思路可以與上一題類似,但是邏輯上應該改變一下,另外定義一個變數值

i,根據最大欄位和的連續性,a[j]+a[j+1]>a[j+1]的真假,確定對i值量,以次遞推,直到迴圈終止,另外與上一題三角形不同的是上一題是一原本的a[n-1]儲存,這次是另外定義變數儲存。這次也實踐很感謝我的隊友!