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

演算法第3章上機實踐報告

1、實踐題目

  數字三角形

2、問題描述

給定一個由 n行數字組成的數字三角形如下圖所示。試設計一個演算法,計算出從三角形 的頂至底的一條路徑(每一步可沿左斜線向下或右斜線向下),使該路徑經過的數字總和最大。

QQ截圖20170929023616.jpg

3、演算法描述

文字描述:新建一個二維陣列b,用來記錄當前數的上一層累加的最大值。由於每一步只能左下或者右下,所以每一行第一個元素和最後一個元素只能選擇右上角和左上角的值,所以遞推式分為三種情況:①(j=1)b[i][j]=a[i][j]+b[i-1][j]; ; ② (j= i ) b[i][j]=a[i][j]+b[i-1][j-1];;③、(j>1 && j<i) b[i][j] = a[i][j]+ max(b[i-1][j-1],b[i-1][j]);

程式碼:d

for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
{
if(j==1)
b[i][j]=a[i][j]+b[i-1][j];
else if(j==i)
b[i][j]=a[i][j]+b[i-1][j-1];
else if(j>1 && j<i)
b[i][j] = a[i][j]+ max(b[i-1][j-1],b[i-1][j]);


}

4、演算法時間及空間複雜度分析(要有分析過程)

新建了一個輔助變數二維陣列b,所以空間複雜度為O(n*n)。利用兩個for迴圈遍歷數字三角形計算最大值,所以時間複雜度為O(n*n)。

5、心得體會(對本次實踐收穫及疑惑進行總結)

第三章主要學習的是動態規劃。而動態規劃最重要的是把原問題分解成多個子問題並得出遞推式,就好像數學題目裡面找規律的題目一樣,但大部分子問題的最優解都由其他子問題的最優解推導得到,所以一般需要輔助空間來記錄已計算出來的子問題最優解,由自底向上的方法慢慢推出原問題的最優解。但如何找到這個正確的遞推式是十分關鍵的一步。在做題過程中思考如何推出這個遞推式是一個比較困難的過程,有想過通過畫表幫助推導。在實踐題第三題就比較頭疼了,缺乏頭緒,最後上網檢視別人的講解才終於搞懂。