1. 程式人生 > 其它 >第三章演算法實驗報告

第三章演算法實驗報告

1.1 問題描述

7-1 最大子段和 (25 分)

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

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

1.2 演算法描述

本題是要求一個序列中子段最大的和,我們需要記錄每段連續子段的和,期間找出最大值,在找的時候如果遇到和小於0就說明這個數之前的數相加為負數,我們會捨棄它,因為和負數相加只會越加越小,然後我們直接從當前計算,一直這樣迴圈,一次次相加後,到了數列最後一個數時一定會有一個最大值,然後我們保留這個最大值並輸出他就是我們要的答案

1.3 問題求解:

1.1.1 根據最優子結構性質,列出遞迴方程式,

dp方程如下,其問題被分解為加到第i項時,前面i-1項子段的最大欄位和與第i項相加後再與第i項比較誰大,誰大就選誰填入表中

1.1.2 給出填表法中表的維度、填表範圍和填表順序。

該表維度為一維表格

1.1.3 分析該演算法的時間和空間複雜度

該演算法為填一維表,所以時間複雜度為O(n)同時開闢一個dp[n]陣列顯然空間複雜度為O(n)

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

一開始生硬的使用了遞迴解題,沒有用動態規劃的思想,後面列出動態方程後沒有快速理解子問題的劃分與填入表格中的每個數的含義

收穫:以後看到類似的題目可以先通過題目中的資料慢慢找到動態方程,然後再慢慢填表驗證

2. 你對動態規劃演算法的理解和體會

程式碼簡短,不用像遞迴一樣寫很多條件語句,但是再構思動態方程與填表需要花更多的時間思考驗證