算法第三章上机实践报告

1.实践题目:数字三角形

2.问题描述:给定一个由 n行数字组成的数字三角形,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。

3.算法描述:先用递归方程( m[i][j] = a[i][j] + max( m[i+1][j], m[i+1][j+1] );)自下往上,写出递归代码,再观察使用填表法修改代码,

4.算法·时间和空间复杂度分析

算法如下:

#include

using namespace std;

int main(){    

   int n;    

   cin >> n;    

   int a[101][101];    

  for( int i = 0; i < n; i++ ) {        

     for( int j = 0; j <= i; j++ ){            

    cin >> a[i][j];        

   }     

}

      int m[101][101];    

  for( int i = n - 1; i >= 0; i-- ){        

     for( int j = 0; j <= i; j++ ){            

       m[i][j] = a[i][j] + max( m[i+1][j], m[i+1][j+1] );        

    }    

  }    

   cout << m[0][0];

  }

时间复杂度:最大的时间复杂度在填表的时候,T(0)= O(n^2),而其他代码最大的时间复杂度为O(n),所以本代码的时间复杂度为O(n^2).

空间复杂度:定义了n,a[n][n],m[n][n],所以空间复杂度为T(o)= O(n^2);

5.心得体会:刚开始写了很多代码,都没有完全通过,之后经过队友的点醒,慢慢回到正道上(从下往上填表),但还是通不过,最后是在边界上改变,完成了这次代码实践。还是要多去注意一些细节。

 

你可能感兴趣的:(算法第三章上机实践报告)