算法第三章上机实践报告

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

计算机