第三章实践报告
1.实践题目
7-1 数字三角形 (30 分)
给定一个由 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
2.问题描述
从一个数字三角形的顶头开始,每一层依次取值,其中下一层的取值必须是上一层所取值得左或右,按照这规则取完每一层,最后要求它们的总和最大。
3.算法分析:
创建一个n*n的表,依次从下到上,左到右填下三角,表中元素代表,从底层开始到该数字三角形的该位置的总权值。
源代码
#include<iostream>
using namespace std;
int main(){
int n, i, j;
cin >> n;
int a[100][100];
for(i = 1; i <= n; i++){
for(j = 1; j <= i; j++)
cin >> a[i][j];
}
int m[n][n];
for(j = 1; j <= n; j++)
m[n][j] = a[n][j];
for(i = n-1; i >= 1; i--)
for(j = 1; j <= i; j++)
{
if(m[i+1][j+1] > m[i+1][j]) m[i][j] = a[i][j] + m[i+1][j+1];
else
m[i][j] = a[i][j] + m[i+1][j];
}
cout<<m[1][1];
// for(i=1; i <= n; i++)
// for(j = 1; j <= i; j++)
// cout<< a[i][j]<<" ";
return 0;
}
4.算法时间及空间复杂度分析(要有分析过程)
时间复杂度:由于要填一个n*n表的,因此时间复杂度为O(N^2)。
5.心得体会(对本次实践收获及疑惑进行总结)
课堂上原本有3个题目的,可是整整的一堂课只做了1道题。当时候我出现的问题在于我C++的底子不扎实,导致在数组的下标中出现了错误,出现了下标越界的问题,使实验的结果不正确。算法的话,已经提前预习了解,在课堂磕磕碰碰也能把它敲出来,不过还是不够熟练。
浙公网安备 33010602011771号