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

演算法第三章實踐報告

7-1數字三角形

1.實踐題目

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

QQ截圖20170929023616.jpg

 

2.問題描述

輸入格式:

輸入有n+1行:

第 1 行是數字三角形的行數 n,1<=n<=100。

接下來 n行是數字三角形各行中的數字。所有數字在0..99 之間。

輸出格式:

輸出最大路徑的值。

 

3.演算法描述

dp[i][j]=max(dp[i+1][j]+val[i][j],dp[i+1][j+1]+val[i][j])

 

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

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

因為演算法是兩層for迴圈,演算法複雜度為O(n2)

由於申請了額外空間儲存,所以空間複雜度為O(n2)

 

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

動態規劃其實並沒有想象中的那麼困難,程式碼實現上並不會過於複雜,其實都是幾段就能實現,但比較困難的地方就在於能否想出演算法問題的遞迴方程式,我覺得要學好動態規劃還得多練習多打程式碼。