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.心得体会:刚开始写了很多代码,都没有完全通过,之后经过队友的点醒,慢慢回到正道上(从下往上填表),但还是通不过,最后是在边界上改变,完成了这次代码实践。还是要多去注意一些细节。
原文:https://www.cnblogs.com/chenyuqi32-2-11/p/11710946.html