演算法 第三章實踐報告
阿新 • • 發佈:2018-11-04
1.實踐題目
數字三角形
2.問題描述
給定一個由 n行數字組成的數字三角形如下圖所示。試設計一個演算法,計算出從三角形 的頂至底的一條路徑(每一步可沿左斜線向下或右斜線向下),使該路徑經過的數字總和最大。
3.演算法描述
for(j=1;j<=n;j++) a[n][j]=d[n][j]; for(i=n-1;i>=1;i--)//從最後一行開始 for(j=1;j<=i;j++)//最後一行第一個開始 {//比較 if(a[i+1][j+1]>a[i+1][j]) a[i][j]=d[i][j]+a[i+1][j+1]; else a[i][j]=d[i][j]+a[i+1][j]; }
4.演算法時間及空間複雜度
for(i=n-1;i>=1;i--) for(j=1;j<=i;j++)
演算法中進行了雙重迴圈進行比較,可知:
時間:O(n^2)
空間:O(n^2)
5.心得體會
本次實踐題目的核心在a[i][j]=d[i][j]+a[i+1][j+1],a[i][j]=d[i][j]+a[i+1][j]上,演算法是從最後一行開始比較最左兩個,取較大地往上比較並且相加然後儲存在a陣列中並且繼續計算。這裡利用了動態規劃中的儲存子問題的結果以便下次計算。理解了題目的意思並捋順了思路之後,兩個人的程式設計就顯得比較的輕鬆。