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(n2),结合max函数,所以总时间复杂度为O(n2);
空间复杂度:开辟了一个新的二维数组,空间复杂度为O(n2);
5、心得体会(对本次实践收获及疑惑进行总结)
(1)感觉可以和课堂内容对应起来了,从找出递归方程到确定填表方向(感觉也是这道题最难的地方),最后做出这道题。但是听讲的时候没觉得很难,动手操作觉得并不简单;
(2)这道题是我的partner动手完成的,她完成之后我看了一遍代码,有一些比较模糊的地方她给我讲的很清楚,于是老师问的问题我答上啦嘿嘿。