数字金字塔最大路径和——递归

题目描述

假设有如下所示的一个数字金字塔,现在,要求写一个程序来查找从顶点到底部任意处结束的路径,使路径经过的数字的和最大,并输出该路径的最大和。比如以下金字塔的和最大路径的和为7+3+8+7+5=30。
7

3 2

8 1 0

2 7 4 4

4 5 2 6 5

C++ Code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
#include <iostream>
#include <cmath>

using namespace std;

const int MAXLAYER = 5; // 金字塔的最大层数

/** @brief
 * 计算金字塔中第layer层第pos个元素在数组中的下标
 *
 * @param layer int 金字塔中第layer层
 * @param pos int 金字塔中第layer层第pos个元素
 * @return int
 *
 */
int Index(int layer, int pos)
{
    return layer * (layer - 1) / 2 + pos;
}

/** @brief
 * 金字塔自上而下路径中,路径和的最大值
 *
 * @param pNums int* 存储金字塔中的数字,这里是一维数组,按层次顺序进行存储
 * @param layer int 金字塔中的第layer层[1, MAXLAYER]
 * @param pos int 金字塔中第layer层的第pos([0, layer-1])个元素
 * @return int 最大路径和
 *
 */
int MaxPathSum(int *pNums, int layer, int pos)
{
    if(MAXLAYER == layer)
    {
        return pNums[Index(layer, pos)];
    }

/**
     * 第layer层的第pos个元素,只能向第layer+1层的第pos或第pos+1个元素走
     */
    return max(MaxPathSum(pNums, layer + 1, pos + 0), MaxPathSum(pNums, layer + 1, pos + 1))
           + pNums[Index(layer, pos)];
}

int main()
{
    // 数组的大小应该为 MAXLAYER * (MAXLAYER + 1) / 2
    int nums[] = {7, 3, 2, 8, 1, 0, 2, 7, 4, 4, 4, 5, 2 ,6, 5};
    cout << MaxPathSum(nums, 1, 0) << endl;

return 0;
}

说明:程序测试有限,不足还望指出。请不吝赐教!      

时间: 2024-10-11 12:27:54

数字金字塔最大路径和——递归的相关文章

1.5.1 Number Triangles 数字金字塔

★1.5.1 Number Triangles 数字金字塔 一.题目描述 考虑在下面被显示的数字金字塔. 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大. 每一步可以走到左下方的点也可以到达右下方的点. 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的样例中,从7 到 3 到 8 到 7 到 5 的路径产生了最大和:30 PROGRAM NAME: numtri 18 INPUT FORMAT 第一个行包含 R(1<= R<=1000) ,表示行的数目

1625 数字金字塔

1625 数字金字塔 链接:http://codevs.cn/problem/1625/ USACO 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 考虑在下面被显示的数字金字塔. 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大. 每一步可以走到下方的点也可以到达右下方的点. 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 在上面的样例中,从 7 到 3 到 8 到 7 到 5 的路径产生了最大和:30 输入描述 Input

【动态规划基础】数字金字塔

题目链接:1258:[例9.2]数字金字塔 1258:[例9.2]数字金字塔 时间限制: 1000 ms         内存限制: 65536 KB提交数: 9635     通过数: 5467 [题目描述] 观察下面的数字金字塔.写一个程序查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可以从当前点走到左下方的点也可以到达右下方的点. 在上面的样例中,从13到8到26到15到24的路径产生了最大的和86. [输入] 第一个行包含R(1≤ R≤1000),表示行的数目. 后面

Python输出数字金字塔

使用Python输出一个数字金字塔 运行结果: 源代码: ''' Python输出数字金字塔 ''' for x in range(1,10): print(' '*(15-x),end='') n=x while n>=1: print(n,sep='',end='') n-=1 n+=2 while n<=x: print(n,sep='',end='') n+=1 print() 原文地址:https://www.cnblogs.com/yijiahao/p/11740372.html

shell脚本编程设计——根据输入的数输出菱形、三角形或者数字金字塔(带闪烁颜色)

shell脚本编程设计--根据输入的数输出菱形.三角形或者数字金字塔(带闪烁颜色) shell脚本程序和解释如下 #!/bin/bash #创建死循环,当输入出错或者输入"quit"字符串退出脚本程序 while true do #等待用户输入 read -p "请输入一个不大于20的正整数(输入"quit"则退出):" n #先判断字符串是否是quit if [ "$n" == "quit" ] then

动态规划入门-数字三角形(从朴素递归到各种优化)

数字三角形(POJ1163) Description 73 88 1 02 7 4 44 5 2 6 5 在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或右下走.只需要求出这个最大和即可,不必给出具体路径.三角形的行数大于1小于等于100,数字为 0 - 99 输入格式:5 //三角形行数.下面是三角形73 88 1 02 7 4 4 4 5 2 6 5 要求输出最大和 Sample Output 30 Source IOI 1994

UVa 112 - Tree Summing(树的各路径求和,递归)

题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=48 Tree Summing  Background LISP was one of the earliest high-level programming languages and, with FORTRAN, is one of the olde

二叉树中节点的最大距离(树的最长路径)——递归解法

上一篇文章说的是该题的一种变形,并给出了非递归解法. 现在我给出原题的一种递归解法.将会看到,现比较上篇博文,今天给出的递归解法的代码实现是相当简洁的. 问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.测试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \    

0-1背包打印路径(递归和非递归版本)

简单的0-1背包打印路径问题,我们可以记录一个p[][]数组来判断,当前物品是否被选中,最后按照记录输出,注意是逆序. #include<stdio.h> #include<string.h> int main() { int a[25],p[25][10005],i,j,n,m,s[10005]; while(scanf("%d%d",&m,&n)!=EOF){ for(i=1;i<=n;i++) scanf("%d"