第三章實踐心得
阿新 • • 發佈:2018-11-04
1、問題描述:
給定一個由 n行數字組成的數字三角形如下圖所示。試設計一個演算法,計算出從三角形 的頂至底的一條路徑(每一步可沿左斜線向下或右斜線向下),使該路徑經過的數字總和最大。
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、心得體會:
本題演算法是動態規劃中的基礎所以比較簡單,但在上機的時候因為一開始設定的陣列比較小導致結果一直出錯,所以今後還是多注意一些語法問題。