1.實踐題目
給定n個整數(可能為負數)組成的序列a[1],a[2],a[3],…,a[n],求該序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。當所給的整數均為負數時,定義子段和為0。
要求演算法的時間複雜度為o(n)。
2.問題描述
題目要求時間複雜度為o(n),所以只能用乙個for迴圈解決問題,要用到動態規劃的演算法。
3.演算法描述
動態規劃遞迴式為b[j]=max(1<=j<=n)定義變數b作為乙個動態的子段和,從第乙個數開始到最後乙個數。每迴圈判斷下乙個數,若大於0,最大子段和有可能包括它,則相加,若小於等於0,最大子段和不包括它。另外定義乙個變數sum儲存最大子段和,每次for迴圈最後判斷當前子段和是否為當前最大子段和。這樣動態儲存就不用額外用乙個陣列b,使**更加簡潔。
4.演算法時間及空間複雜度分析(要有分析過程)
時間複雜度:只有乙個for迴圈 故t(n)=o(n)
空間複雜度:所需要的儲存空間為與序列a等大 故s(n)=o(n)
5.心得體會(對本次實踐收穫及疑惑進行總結)
動態規劃的**很簡短,效率很高。這需要我們在解決問題前很好的分析問題,盡可能的簡化**。一開始對b和sum起的作用不理解,後來在同伴的講解下才明白。只有理解方法,才能用**實現出來。結對程式設計幫助我更容易理解**,學習同伴的長處,對自己的薄弱的程式設計能力也有所提高。
演算法第三章上機實踐報告
一 實踐題目 7 2 最大子段和 給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整數均為負數時,定義子段和為0。要求演算法的時間複雜度為o n 輸入格式 輸入有兩行 第一行是n值 1 n 10000 第二行是n個整...
演算法第三章上機實踐報告
7 1 數字三角形 30 分 給定乙個由 n行數字組成的數字三角形如下圖所示。試設計乙個演算法,計算出從三角形 的頂至底的一條路徑 每一步可沿左斜線向下或右斜線向下 使該路徑經過的數字總和最大。1.路徑經過的數字總和最大 2.每一步可沿左斜線向下或右斜線向下 1 由題目可知從上到下,只能往左或者往右...
演算法第三章上機實踐報告
引論 這是第二次在演算法課上的上機實踐了,雖然逐漸有了思考演算法的感覺,但這一次上機實踐還是並不輕鬆。關鍵在於在實驗課前對第三章的知識掌握得還不足夠,經常會因為明明知道理論上如何解題而苦於無法將其實現。不過,通過本次上機實踐,我的收穫是非常豐富的,下面用實踐課題目中的第一題 數字三角形 開始分享我的...