当前位置:首页 > 题解目录 > 正文内容

【题解】数字三角问题

亿万年的星光5年前 (2021-05-29)题解目录2352

【题目描述】

给字一个由n行数字组成的数字三角形(等腰三角形)。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。

【输入描述】

数字三角形的行数和数字三角形

【输出描述】


最大的路径和

【样例输入1】

5
7
8 3
9 8 7
1 2 3 4
4 5 6 7 8

【样例输出1】

33

【样例输入2】

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

【样例输出2】

30

【样例解释】

对于样例1,路径是7 8  8 3 7

【题目分析】

  1. 从输入的角度看,第一行一个数,第二行两个数,第三行三个数,依次类推(类似九九乘法表那种)。

  2. 典型的”动态规划“类型问题。需要用到递归的思想

  3. 需要推导出"状态转移方程"




【参考答案1】——递归思路

用二维数组D来存放数字三角形,问题转换如下:


D(i,j):表示第 i 行第 j 列的数字。(i,j从0开始)

Sum(i,j):表示从 D(i,j) 到底边的最优解,即:从 D(i,j) 到底边的各条路径中,数字之和最大的一个。

问题:求 Sum(0,0)。即:第0行第0列到底边的路径的最大和。


当只有一行时,它的最大路径和就是它本身。

即:Sum(i,j) =D(i,j)

其次,它的最大路径和就是它本身加上它下面左右两个元素的最大路径和的较大者。因为是使用二维数组来存数字,就是它本身加上他正下方和他右下方两个元素的最大路径和的较大者。

即:Sum(i,j) =max{Sum(i+1,j),Sum(i+1,j+1)}+D(i,j)

写出递归方程:

image.png

然后根据递归方程

#include<iostream>
using namespace std;
const int N = 100;
int D[N][N];
int max(int a, int b)
{
	int m = a > b ? a : b;
	return m;
}
int fun_d(int i,int j,int n)
{
	if (i == n-1)
		return D[i][j];
	int Sum_L = fun_d(i + 1, j, n);
	int Sum_R = fun_d(i + 1, j + 1, n);
	return max(Sum_L, Sum_R)+D[i][j];

}
int main()
{
	int n, i, j;

	cin >> n;//n行数
	for (i = 0; i < n; i++)
	{
		for (j = 0; j <= i; j++)
		{
			cin >> D[i][j];
		}
	}
	int MaxSum = fun_d(0,0,n);
	cout << MaxSum << endl;
	return 0;
}

【参考答案2】

#include <iostream>
#include <algorithm>
using namespace std;
#define MAX 101
int n;
int D[MAX][MAX];
int maxSum[MAX][MAX];

int main()
{
    int i,j;
    cin >> n;
    for(i = 1;i <= n;i++)
        for(j = 1;j <= i;j++)
            cin >> D[i][j];
    
    for( int i = 1;i <= n; ++ i )
        maxSum[n][i] = D[n][i];//最后一行的值正好就等于D的最后一行的值
    
    for( int i = n-1; i >= 1; --i )//从n-1行向上一直推到第一行
        for( int j = 1; j <= i; ++j )//对于每一行我们要从左到右求出每一个数字的最大和
            maxSum[i][j] = max(maxSum[i+1][j],maxSum[i+1][j+1]) + D[i][j];
    
            cout << maxSum[1][1] << endl;
}


扫描二维码推送至手机访问。

版权声明:本文由青少年编程知识记录发布,如需转载请注明出处。

分享给朋友:

相关文章

八皇后问题

八皇后问题

【题目描述】八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行...

【题解】Ride to Office

【题目描述】起点与终点相隔4500米。现Charley 需要从起点骑车到终点。但是,他有个习惯,沿途需要有人陪伴,即以相同的速度, 与另外一个人一起骑。而当他遇到以更快的速度骑车的人时,他会以相应的速...

【题解】均分蛋糕

【题目描述】小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, …, an。小明想分给每个朋友至少重量为k的蛋糕。小明的朋友们已经排好队准备领蛋糕,对于每个...

【题解】牛的阵容

【题目描述】农民约翰雇一个专业摄影师给他的奶牛拍照。由于约翰的牛有很多品种,他喜欢他的照片包含每个品种至少一头牛。约翰的牛都站在数轴的不同地方,每一头牛由一个整数位置 X_i 以及整数品种编号 ID_...

【题解】最大子矩阵

【题目描述】已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 × 1)子矩阵。比如,如下4 × 4的矩阵0  -2 -7&nb...

【题解】阳光

【题目描述】给出一个n*n的矩阵,矩阵每个元素数值代表这个位置的阳光情况,给出正整数k,需要我们求出哪一处的k*k 区域的阳光平均值最多,阳光平均值为k*k 区域的阳光总和除于k*k。蒜头君想让我们输...