算法第3章上機實踐報告

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了,可是第三題的時候想法錯了,後來回到宿舍才解決,結對編程帶來了不少便捷,有時候一些問題本身思考不出來,和同伴討論一下就知道本身的錯誤,大大提升了效率,動態規劃主要是它的表達式的構建,感受本身對動態規劃類問題還不夠熟悉,從此還要多加練習。

相關文章
相關標籤/搜索