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

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

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

實踐報告任選一題進行分析。內容包括:

1.實踐題目

7-1數字三角形

2.問題描述

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

3.演算法描述

我的思路:題意為從三角形頂到底的最大路徑,解決問題的時候從底部入手,相鄰的兩層數字依次進行合併。較低層與其上一層運算時,依次將較低層的相鄰兩個數比較取最大值來與其上一層的數字進行合併計算。

首先將數字三角形儲存在一個二維陣列a[n][n]中,

然後先對數字三角形的最底層進行比較:

   for(int i=n;i>0;i--)

   for(int j=1;j<=i;j++){

if((a[i][j]+a[i-1][j])>(a[i][j+1]+a[i-1][j]))

{

a[i-1][j]=a[i][j]+a[i-1][j];

}

else a[i-1][j]=a[i][j+1]+a[i-1][j];

   }

最後再輸出最高位a[1 ][1 ]:cout<<a[1][1];

 

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

時間複雜度:因為兩個for語句疊在一起,所以時間複雜度為O(n^2)

空間複雜度:該演算法直接在原陣列a[n][n]上操作的,所以空間複雜度為O(1)。

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

剛開始我是用自己對動態分析的理解用Max(i,j)表示代表從第 r 行的第 j 個數字到底邊的最佳路徑的數字之和,可是遞推公式不是很好寫,在老師講解之後才寫出來遞迴公式:Max ( r, j) = Max{ Max (r+1,j), Max (r+1,j+1) } + a(r,j).在此寫出還沒有寫出遞迴公式之前,我用的是以上分析的兩個迴圈,自下而上,先判斷下一層左邊a[i][j]和右邊a[i][j+1]與上一層相鄰數字a[i-1][j]相加的大小,比較之後大直接再次賦值給a[i-1][j],依次這樣比較,最後最大的值將是a[1][1].由此輸出a[1][1]即可。由此兩種雖然神通型不同的方法。我覺得動態規劃最難點還是寫出遞迴方程式,我出現的情況就是,雖然能夠想的到,但是不太能夠寫的出來,只會用簡單的迴圈。由此我覺得動態規劃這一塊還是得多練題,多接觸不同的題型,才能活躍自己的思維,能夠想出解決的辦法。