一 . 實踐題目
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個整數。
例如:6
-2 11 -4 13 -5 -2
輸出格式:
輸出最大子段和。
例如:
二 . 問題描述
題目要求時間複雜度為o(n),並且序列全為負數時,輸出為0,這是動態規劃中的乙個典型問題,當遇到這種兩端都為變化的情況時需要固定一端進行分析。
三 . 演算法描述
描述:設定乙個陣列2,當shuzu2[j] > 0時,shuzu2[j+1] = shuzu2[j] + shuzu1[j+1];否則,shuzu2[j+1] = shuzu1[j+1];這樣從0到n迴圈一次,最終得到的陣列2中最大的值即為所求最大子段和。
**:
#include usingnamespace
std;
intmain()
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
else
shuzu2[j+1] = shuzu1[j+1
]; }
intmax;
max = shuzu2[0
];
for(int i = 1; i < n; i++)
}if(max < 0
)
else
cout
<< max
}
四 . 時間複雜度分析
時間複雜度:o(n),得到陣列2使用了一次迴圈,查詢陣列2的最大值也使用了一次迴圈,所以時間複雜度為o(n)
空間複雜度:o(1),只使用了乙個一維陣列,所以為o(1)
五 . 心得體會
在結對程式設計的過程中,我和同伴可以一起討論提供思路,在做這道題的時候一開始不知道從何下手,後來想到了固定一端來簡化問題,我們就開啟了思路解決了這個問題,以後還是應該多看多練。
演算法第三章上機實踐報告
7 1 數字三角形 30 分 給定乙個由 n行數字組成的數字三角形如下圖所示。試設計乙個演算法,計算出從三角形 的頂至底的一條路徑 每一步可沿左斜線向下或右斜線向下 使該路徑經過的數字總和最大。1.路徑經過的數字總和最大 2.每一步可沿左斜線向下或右斜線向下 1 由題目可知從上到下,只能往左或者往右...
演算法第三章上機實踐報告
引論 這是第二次在演算法課上的上機實踐了,雖然逐漸有了思考演算法的感覺,但這一次上機實踐還是並不輕鬆。關鍵在於在實驗課前對第三章的知識掌握得還不足夠,經常會因為明明知道理論上如何解題而苦於無法將其實現。不過,通過本次上機實踐,我的收穫是非常豐富的,下面用實踐課題目中的第一題 數字三角形 開始分享我的...
演算法第三章上機實踐報告
1.實踐題目 給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整數均為負數時,定義子段和為0。要求演算法的時間複雜度為o n 2.問題描述 題目要求時間複雜度為o n 所以只能用乙個for迴圈解決問題,要用到動態規劃...