1、实践题目:7-1 数字三角形
2、问题描述:
给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。
输入格式:
输入有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
3、算法描述
#include <iostream> using namespace std; int max(int a,int b) { return (a>=b)?a:b; } int main() { int n,i,j; cin>>n; int num[n+1][n+1]; int m[n+1][n+1]; for(i=1;i<=n;i++) for(j=1;j<=i;j++) cin>>num[i][j]; for(j=1;j<=n;j++) m[n][j]=num[n][j]; for(i=n-1;i>0;i--) for(j=1;j<=i;j++) m[i][j]=max(m[i+1][j],m[i+1][j+1])+num[i][j]; cout<<m[1][1]; return 0; }
4、算法时间及空间复杂度分析(要有分析过程)
时间复杂度:main函数for循环嵌套,时间复杂度为O(n),结合max函数,所以总时间复杂度为O(n);
空间复杂度:开辟了一个新的二维数组,空间复杂度为O(n);
5、心得体会(对本次实践收获及疑惑进行总结)
(1)感觉可以和课堂内容对应起来了,从找出递归方程到确定填表方向(感觉也是这道题最难的地方),最后做出这道题。但是听讲的时候没觉得很难,动手操作觉得并不简单;
(2)这道题是我的partner动手完成的,她完成之后我看了一遍代码,有一些比较模糊的地方她给我讲的很清楚,于是老师问的问题我答上啦嘿嘿。