OJ-43题: 数字三角形
题目描述:
有一个由数字组成的三角形数塔,站在上一层的某个点,只能到达其下方左右的两个点。现在请找到一条从上到下的路径,使得路径上所有数字相加之和最大
输入 第一行输入一个数字 n(1≤n≤1000)代表数塔层数
接下来n行,按数塔图形,每行有一个或多个的整数,表示该层节点的值(节点值≤100000) 输出一个整数,代表从上到下路径上所有数字相加和的最大值。
样例输入:
6
3
9 5
4 2 1
3 4 9 6
3 5 3 7 3
2 1 3 9 3 2样例输出:
39数据规模与约定:
时间限制:1 s
内存限制:64 M
100% 的数据保证 1≤n≤1000
代码演示:
1.从上往下算:
解题思路:
1. 从 1,1 开始存储数据,避免因为边界问题写判断语句。
2. 从上往下算,计算每一步的最大和。公式: ans[x][y] = max(ans[x - 1][y - 1],ans[x - 1][y]) + num[x][y];
3.最后输出最后一排数据的最大值即可
#include<iostream>
#include<cstdio>
using std::max;
int num[1005][1005],ans[1005][1005];
int main(){
int tier;
scanf("%d",&tier);
for(int i = 1; i <= tier; i++){
for(int j = 1; j <= i; j++){
ans[i][j] = max(ans[i - 1][j - 1], ans[i - 1][j]) + num[i][j];
}
}
int max = 0;
for(int i = 1; i <= tier; i++){
max = max(max,ans[tier][i]);
}
printf("%d",max);
return 0;
}
2.从下往上算:
解题思路:
1. 从 1,1 开始存储数据,避免因为边界问题写判断语句。
2. 从下往上算,计算每一步的最大和。公式: ans[x][y] = max(ans[x + 1][y],ans[x+1][y+1]) + num[x][y];
3.最后输出顶端的值,也就是 1,1 的值即可
#include <iostream>
#include <cstdio>
using namespace std;
int num[1005][1005],ans[1005][1005];
int main(){
int tier;
scanf("%d",&tier);
for(int i = 1; i <= tier; i++){
for(int j = 1; j <= i; j++){
scanf("%d",&num[i][j]);
}
}
for(int i = tier; i > 0; i--){
for(int j = 1; j <= i; j++){
ans[i][j] = max(ans[i+1][j],ans[i+1][j+1]) + num[i][j];
}
}
printf("%d",ans[1][1]);
return 0;
}