一、实践题目
数字三角形
二、问题描述
给定一个由 n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形 的顶至底的一条路径(每一步可沿左斜线向下或右斜线向下),使该路径经过的数字总和最大。
输入格式:
输入有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),因为空间复杂度是计算算法的辅助空间单元的个数,即为算法执行时创建的变量个数,此算法创造的辅助变量为常数,故空间复杂度为常数。
五、心得体会
本次上机实践中,遇到问题例如递归的使用、循环体的逻辑关系,代码的使用语法等时,翻阅参考书中资料做出代码实现;同时作为负责协助编程的同学,我与结对编程伙伴对所编写的程序进行讨论交流,实在不清楚的地方一起使用互联网的力量查找信息。在这整个过程中,理解了伙伴的编程思路也学到了新的编程知识,同时巩固了算法知识。
算法第三次上机实践报告
原文:https://www.cnblogs.com/nanvoqnlo/p/11715947.html