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

【题解】数字三角问题

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

【题目描述】

给字一个由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;
}


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

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

分享给朋友:

相关文章

【题解】翻手算法

翻手算法(fanshou.cpp) 【问题描述】 ⼩酷爱算法,他在编程珠玑⼀书中了解到了⼀种新的算法——翻⼿算法,为了更好的理解算 法,⼩明找来⼀叠纸牌,每⼀张纸牌上只有⼀个⼤写或...

【题解】河中跳房子

【题目描述】每年奶牛们都要举办各种特殊版本的跳房子比赛,包括在河里从一个岩石跳到另一个岩石。这项激动人心的活动在一条长长的笔直河道中进行,在起点和离起点L远 (1 ≤ L≤ 1,000,000,000...

奶牛的耳语

【题目描述】在你的养牛场,所有的奶牛都养在一排呈直线的牛栏中。一共有 n头奶牛,其中第 ii头牛在直线上所处的位置可以用一个整数坐标 pi(0<pi<10^8...

【题解—深搜】马走日

【题解—深搜】马走日

【题目描述】马在中国象棋以日字形规则移动。请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。【输入】第一行为整...

小苹果(apple)

【题目描述】小 Y 的桌子上放着n个苹果从左到右排成一列,编号为从1到n。小苞是小 Y 的好朋友,每天她都会从中拿走一些苹果。每天在拿的时候,小苞都是从左侧第1个苹果开始、每隔2个苹果拿走2个苹果。随...

【题解】合唱队形

【题目描写】N位同学站成一排,音乐老师要请其中的(N−K)位同学出列,使得剩下的KK位同学排成合唱队形。合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2,…,K,他们的身高分别为T1,T...