算法第三章上机实践报告
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.心得体会:重点在于理解题意,写出递归方程,最终写出代码