演算法第三章上機實踐報告
阿新 • • 發佈:2018-11-04
- 實踐題目
7-1 數字三角形 (30 分)
給定一個由 n行數字組成的數字三角形如下圖所示。試設計一個演算法,計算出從三角形 的頂至底的一條路徑(每一步可沿左斜線向下或右斜線向下),使該路徑經過的數字總和最大。
輸入格式:
輸入有n+1行:
第 1 行是數字三角形的行數 n,1<=n<=100。
接下來 n行是數字三角形各行中的數字。所有數字在0..99 之間。
輸出格式:
輸出最大路徑的值。
輸入樣例:
在這裡給出一組輸入。例如:
5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5
輸出樣例:
在這裡給出相應的輸出。例如:
30
- 問題描述
要求先輸入一個n行的數,每行的元素個數i滿足i=n(n是行數),即形成一個三角形的形狀(但實際可以理解成輸入一個矩陣的下三角)。隨後求從最頂端的那個元素往下遍歷,要求遍歷路徑上的元素相加以後值最大。 - 演算法描述
假定a[i][j]表示第i行到第j行的路徑上的元素相加以後的最大值,因此可以得到遞推式:a[i][j]=max{a[i][j]+b[i+1][j], a[i][j]+b[i+1][j+1]}
採用自底向上的方法來計算最大值,首先是把最底下一行的值都賦值給a[n][j](j for 1 to n),然後是不斷地向上,不斷地把b的值賦給a,賦值完成以後就不用考慮這一行了。 -
1 void NumberTriangle(int n, int a[][101], int b[][101]) 2 { 3 for(int j = 1; j <=n; j++) { 4 a[n][j] = b[n][j]; 5 } 6 for(int i = n - 1; i >= 1; i--) { 7 for(int j = 1; j <= i; j++) { 8 if(a[i+1][j] > a[i+1][j+1
- 演算法時間及空間複雜度分析(要有分析過程)
for(int i = n - 1; i >= 1; i--) { 7 for(int j = 1; j <= i; j++) {
據此可知時間複雜度為O(n²)空間複雜度O(n²)
- 心得體會(對本次實踐收穫及疑惑進行總結)
通過本次的實踐練習,進一步的理解了動態規劃演算法如何在不同問題中進行實際的應用,對動態規劃演算法的思想有了進一步的理解,也更加熟悉了動態規劃演算法的解題步驟,知道了如何根據遞迴方程寫出對應的程式碼。