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

演算法 第三章實踐報告

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陣列中並且繼續計算。這裡利用了動態規劃中的儲存子問題的結果以便下次計算。理解了題目的意思並捋順了思路之後,兩個人的程式設計就顯得比較的輕鬆。