1、实践题目
1113:数字三角形问题
2、问题描述
给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,移动方向只能是下方和右下方,使该路径经过的数字总和最大。 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 对于给定的由 n行数字组成的数字三角形,计算从三角形的顶至底的路径经过的数字和的最大值。
Input
第 1 行是数字三角形的行数 n,1≤n≤100。接下来n行是数字三角形各行中的数字。所有数字在0..99之间。
Output
输出最大值
SampleInput
5
7
38
81 0
27 4 4
45 2 6 5
SampleOutput
30
3、算法描述
从下往上开始相加,用一个数组来保存路径和,用数组d存放数字三角形,用数组a记录当前最大路径和,用max函数找出两条路径最大的那个然后往上加。
代码:
#include <iostream>
#include <stdio.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
//定义存储状态的数组
int a[105][105];
for(int i = 1; i <= n; i++){
for(int j = 1; j <= i; j++){
scanf("%d",&a[i][j]);
}
}
for(int i = n-1; i >= 1; i--){
for(int j = 1; j <= i; j++){
a[i][j] = a[i][j] + max(a[i+1][j],a[i+1][j+1]);
}
}
printf("%d",a[1][1]);
}
4、算法时间及空间复杂度分析
因为定义了一个二维数组,而空间复杂度跟数组长度有关,因此空间复杂度为O(n*n)。
时间复杂度:从下到上遍历n次,每层遍历i个,所以时间复杂度为O((n^2+n)/2)。