演算法第三章上機實踐
阿新 • • 發佈:2018-11-02
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.心得體會
動態規劃的學習與解答問題比較難思考,但是對程式設計的複雜度大大減少,使程式碼更精簡,思路更清晰。另外,對於問題不能一味蠻幹,需要和自己的隊友一起思考,討論,往往能得出更加合適的答案,感受到合作的魅力。