1.實踐題目ios
數字三角形算法
2.問題描述編程
給定一個由 n行數字組成的數字三角形以下圖所示。試設計一個算法,計算出從三角形 的頂至底的一條路徑(每一步可沿左斜線向下或右斜線向下),使該路徑通過的數字總和最大。數組
3.算法描述spa
第一行只有一個數,不管哪條路徑都要通過第一行,因此開闢一個二維數組從底至頂進行循環存儲,到第二層開始取最大的路徑保存即:b[i][j]=max(b[i+1][j],b[i+1][j+1])+a[i][j],最後新開闢的dp數組的第一個元素存的即爲數字三角形路徑總和最大的那個數設計
代碼以下code
#include<iostream> #include<cstdio> using namespace std; const int maxn = 105; int n; int a[maxn][maxn],b[maxn][maxn]; int main(){ cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=i;j++){ cin>>a[i][j]; } for(int i=n;i>=1;i--) for(int j=1;j<=i;j++){ b[i][j]=max(b[i+1][j],b[i+1][j+1])+a[i][j]; } cout<<b[1][1]; return 0; }
4.算法時間複雜度及空間複雜度分析blog
時間複雜度:循環中嵌套了一個循環,因此時間複雜度爲O(n²)ci
空間複雜度:爲了存儲最大路徑的值開闢了二維數組,因此空間複雜度爲O(n²)io
5.心得體會
本次實踐還算比較順利,看到前兩題有思路直接a了,可是第三題的時候想法錯了,後來回到宿舍才解決,結對編程帶來了不少便捷,有時候一些問題本身思考不出來,和同伴討論一下就知道本身的錯誤,大大提升了效率,動態規劃主要是它的表達式的構建,感受本身對動態規劃類問題還不夠熟悉,從此還要多加練習。