算法第三章上机实践报告

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

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

3.算法描述:写出递归方程( m[i][j] = a[i][j] + max( m[i+1][j], m[i+1][j+1] );),根据递归方程自下往上,写出代码,再使用填表法修缮代码,提高运算速度。

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

算法如下:

#include<iostream>

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.心得体会:重点在于理解题意,写出递归方程,最终写出代码

posted @ 2019-10-21 00:11  Dantalian  阅读(112)  评论(0编辑  收藏  举报