1. 程式人生 > >第三章實踐心得

第三章實踐心得

1、問題描述:

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

QQ截圖20170929023616.jpg

2、演算法描述:

for(i=1;i<=n;i++){
    for(j=1;j<=i;j++){
     cin>>a[i][j]; }  }

for(j=1;j<=n;j++)
       dp[n][j]=a[n][j];
    for(i=n-1; i>=1; i--)
    {
     for(j=1; j<=i; j++)
     {
      dp[i][j]= a[i][j]+ max(dp[i+1][j], dp[i+1][j+1]);
     }
    }
    cout<<dp[1][1];

定義一個新陣列dp[]來存放路徑最長的總和,通過一個遞迴演算法,自底向上,dp[n-1] = a[i][j]+ max(dp[i+1][j], dp[i+1][j+1]),最後dp[1][1]的值就是最大總和。

3、演算法空間、時間複雜度分析:

該演算法的最高階是迴圈巢狀,因此時間複雜度為:n*(n-1)+(n-1)+......+2*1

O(n)=n*n;

空間複雜度為n*n;

4、心得體會:

本題演算法是動態規劃中的基礎所以比較簡單,但在上機的時候因為一開始設定的陣列比較小導致結果一直出錯,所以今後還是多注意一些語法問題。