【3-4】数字三角形问题

´问题描述:
给定一个由 n 行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形
的顶至底的一条路径,使该路径经过的数字总和最大。
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
´编程任务:
对于给定的由 n 行数字组成的数字三角形,编程计算从三角形的顶至底的路径经过的数
字和的最大值。
´数据输入:
由文件 input.txt 提供输入数据。文件的第 1 行是数字三角形的行数 n,1£n£100。接下
来 n 行是数字三角形各行中的数字。所有数字在 0..99 之间。
´结果输出:
程序运行结束时,将计算结果输出到文件 output.txt 中。文件的第 1 行中的数是计算
出的最大值。
输入文件示例 输出文件示例
input.txt output.txt
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
30

【题解】

/* 设f[i][j]表示从(1,1)走到(i,j)的最大值 f[i][j] = max(f[i-1][j],f[i-1][j-1])+a[i][j]; */

【代码】

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 100;

int f[N + 10][N + 10];
int n, a[N + 10][N + 10];

int main() {
	//freopen("C://Users//Administrator//Desktop//测试数据//ch3//prog34//test//tri6.in","r",stdin);
	cin >> n;
	for (int i = 1;i <= n;i++)
		for (int j = 1; j <= i; j++) {
			cin >> a[i][j];
		}
	f[1][1] = a[1][1];
	for (int i = 2; i <= n; i++) {
		for (int j = 1; j <= i; j++) {
			f[i][j] = max(f[i - 1][j], f[i - 1][j - 1]) + a[i][j];
		}
	}
	int ans = f[n][1];
	for (int i = 1; i <= n; i++) {
		ans = max(ans, f[n][i]); 
	}
	cout << ans << endl;
	return 0;
}

原文地址:https://www.cnblogs.com/AWCXV/p/11665414.html