1. 程式人生 > >第三章實踐作業

第三章實踐作業

實踐題目

數字三角形

 

問題描述

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

 

演算法描述

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];
  }

 

演算法時間及空間複雜度分析

大體思路就是每次第一次計算出MaxSum(i,j)的值時,把該值儲存起來,以後再遇到MaxSum(i.j)時直接取出之前第一次呼叫時已經存放的值即可,不必再次呼叫MaxSum函式作遞迴計算。這樣每個MaxSum(i,j)都只需要計算一次,計算次數為數字三角形中的數字總數。因此,不需要寫遞迴函式,從第N-1行開始向上逐行遞推,就可以求得a[1][1]的值。

 

心得體會

這一章學的是動態規劃,雖然這題是基礎中的基礎,但是還是學到了很多東西。