导航

算法第三次上机实践报告

Posted on 2019-10-21 20:36  郑丹儿  阅读(127)  评论(0编辑  收藏  举报

一、实践题目

数字三角形

二、问题描述

 

给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。

QQ截图20170929023616.jpg

输入格式:

输入有n+1行:

第 1 行是数字三角形的行数 n,1<=n<=100。

接下来 n行是数字三角形各行中的数字。所有数字在0..99 之间。

输出格式:

输出最大路径的值。

三、算法描述

本题考验的知识主要分为逻辑理论和操作实践。逻辑上要弄清楚本题的解题切入点和思路,是较为困难的部分;操作中则需要将解题步骤转化为代码实现,这一点在本题难度不大。

从逻辑理论来说,本题的切入点是找到从哪一个地方开始进入运算,找到本题求解的规律所在,明确使用递归的思想;从编程来看,我们在代码实现中运用的是递归和循环体的知识。

 

以下为具体代码:

 
#include <iostream>
using namespace std;
int main(){
    int n;
    cin>>n; //行数
    int a[100][100];
    int b[100][100];
    for (int i=1; i<=n; i++){
        for (int j=1; j<=i; j++){
            cin>>a[i][j];
            b[i][j] = a[i][j];
        }
    }
    for (int i=n-1; i>=1; i--){
        for (int j = 1; j<=i; j++){
            b[i][j] = a[i][j] + max(b[i+1][j],b[i+1][j+1]);
        }
    }
    cout << b[1][1];
    return 0;
}
int max(int a, int b){
    if (a>b){
        return a;
    }else
        return b;
}
 
 
四、算法时间及空间复杂度分析
最坏情况下时间复杂度为O(n),因为每一次循环都是把问题规模减掉一,故要找到指定数字,则计算以问题规模n的值即为循环次数。
空间复杂度为O(1),因为空间复杂度是计算算法的辅助空间单元的个数,即为算法执行时创建的变量个数,此算法创造的辅助变量为常数,故空间复杂度为常数。
 
五、心得体会
本次上机实践中,遇到问题例如递归的使用、循环体的逻辑关系,代码的使用语法等时,翻阅参考书中资料做出代码实现;同时作为负责协助编程的同学,我与结对编程伙伴对所编写的程序进行讨论交流,实在不清楚的地方一起使用互联网的力量查找信息。在这整个过程中,理解了伙伴的编程思路也学到了新的编程知识,同时巩固了算法知识。