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

演算法第三章上機實踐報告

  1. 實踐題目
    7-1 數字三角形 (30 分)

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

    QQ截圖20170929023616.jpg

    輸入格式:

    輸入有n+1行:

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

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

    輸出格式:

    輸出最大路徑的值。

    輸入樣例:

    在這裡給出一組輸入。例如:

    5 
    7 
    3 8 
    8 1 0 
    2 7 4 4
    4 5 2 6 5 
    

    輸出樣例:

    在這裡給出相應的輸出。例如:

    30
  2. 問題描述
    要求先輸入一個n行的數,每行的元素個數i滿足i=n(n是行數),即形成一個三角形的形狀(但實際可以理解成輸入一個矩陣的下三角)。隨後求從最頂端的那個元素往下遍歷,要求遍歷路徑上的元素相加以後值最大。

  3. 演算法描述
    假定a[i][j]表示第i行到第j行的路徑上的元素相加以後的最大值,因此可以得到遞推式:a[i][j]=max{a[i][j]+b[i+1][j], a[i][j]+b[i+1][j+1]}
    採用自底向上的方法來計算最大值,首先是把最底下一行的值都賦值給a[n][j](j for 1 to n),然後是不斷地向上,不斷地把b的值賦給a,賦值完成以後就不用考慮這一行了。
  4.  1 void NumberTriangle(int n, int a[][101], int b[][101])
     2 {
     3         for(int j = 1; j <=n; j++)    {
     4             a[n][j] = b[n][j];
     5         }
     6     for(int i = n - 1; i >= 1; i--)    {
     7         for(int j = 1; j <= i; j++)    {
     8             if(a[i+1][j] > a[i+1][j+1
    ]) a[i][j] = a[i+1][j] + b[i][j]; 9 else a[i][j] = a[i+1][j+1] + b[i][j]; 10 } 11 } 12 cout << a[1][1]; 13
  5. 演算法時間及空間複雜度分析(要有分析過程)
        for(int i = n - 1; i >= 1; i--)    {
     7         for(int j = 1; j <= i; j++)    {

    據此可知時間複雜度為O(n²)空間複雜度O(n²)

  6. 心得體會(對本次實踐收穫及疑惑進行總結)
    通過本次的實踐練習,進一步的理解了動態規劃演算法如何在不同問題中進行實際的應用,對動態規劃演算法的思想有了進一步的理解,也更加熟悉了動態規劃演算法的解題步驟,知道了如何根據遞迴方程寫出對應的程式碼。