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动手完成的,她完成之后我看了一遍代码,有一些比较模糊的地方她给我讲的很清楚,于是老师问的问题我答上啦嘿嘿。

02-13 21:26