1. 程式人生 > >演算法第三章上機實踐

演算法第三章上機實踐

1.實踐題目

最大子段和 

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個整數。

輸出格式:

輸出最大子段和。

3.演算法描述

int maxsum(int a[],int n)
{
    int sum=0,k=0;
    for(int i=0;i<n;i++)
    {
        
if(k>0) k+=a[i]; else k=a[i]; if(k>sum)sum=k; }

通過對當前子段和與以存的比較,不斷更新最大子段和。

4.演算法的時間及空間複雜度

時間複雜度為O(n)因為只用了單獨的for迴圈的動態規劃求解子段和。

空間複雜度為O(n)因為除了輸入開的大小為n的陣列,沒有開更大的空間,只有幾個儲存結果的變數。

5.心得體會

動態規劃的學習與解答問題比較難思考,但是對程式設計的複雜度大大減少,使程式碼更精簡,思路更清晰。另外,對於問題不能一味蠻幹,需要和自己的隊友一起思考,討論,往往能得出更加合適的答案,感受到合作的魅力。