C++ 算法 OJ-43题: 数字三角形,求路径和的最大值

OJ-43题: 数字三角形

题目描述:

  1. 有一个由数字组成的三角形数塔,站在上一层的某个点,只能到达其下方左右的两个点。现在请找到一条从上到下的路径,使得路径上所有数字相加之和最大

  2. 输入 第一行输入一个数字 n(1≤n≤1000)代表数塔层数

  3. 接下来n行,按数塔图形,每行有一个或多个的整数,表示该层节点的值(节点值≤100000) 输出一个整数,代表从上到下路径上所有数字相加和的最大值。

  4. 样例输入:
    6
    3
    9 5
    4 2 1
    3 4 9 6
    3 5 3 7 3
    2 1 3 9 3 2

  5. 样例输出:
    39

  6. 数据规模与约定:
    时间限制: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;
}

Guess you like

Origin blog.csdn.net/qq_34970171/article/details/115829497