算法训练 数字三角形(递归求数组类的最大值)(示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路   径,使该路径所经过的数字的总和最大。)

问题描述

(图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
  径,使该路径所经过的数字的总和最大。
  ●每一步可沿左斜线向下或右斜线向下走;
  ●1<三角形行数≤100;
  ●三角形中的数字为整数0,1,…99;
在这里插入图片描述

输入格式
  文件中首先读到的是三角形的行数。

接下来描述整个三角形
输出格式
  最大总和(整数)
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30

思路:

这一道题首先很容易想到的是递归,遍历所有的路径,然后找出最大值,但是,可惜的是超时。
我们需要的是从倒数第二行倒着看,你会发现一个规律。
我们以一个串序号为例
1
2 3
4 5 6
7 8 9 10
先看倒数第二行
4 = max(7,8) + 4
5 = max(8,9) + 5
6 = max(9,10) + 6
接着向上一行
2 = max(4,5) + 2
3 = max(5,6) + 3
接着向上一行
1 = max(2,3) + 1
规律很明显就找出来了

代码呈上:

#include <stdio.h>
#define max(x,y) (x>y)?x:y
int dp[100][100];
int main()
{
    int n;
    scanf("%d",&n);
    int i,j;
    for(i=0;i<n;i++)
        for(j=0;j<=i;j++)
            scanf("%d",&dp[i][j]);
    for(i=n-2;i>=0;i--)
        for(j=0;j<=i;j++)
            dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]);
    printf("%d\n",dp[0][0]);
    return 0;
}

运行示例
在这里插入图片描述

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,根据您的要求,我可以为您提供一个解决该问题的Python程序: ``` triangle = [[75], [95, 64], [17, 47, 82], [18, 35, 87, 10], [20, 4, 82, 47, 65], [19, 1, 23, 75, 3, 34], [88, 2, 77, 73, 7, 63, 67], [99, 65, 4, 28, 6, 16, 70, 92], [41, 41, 26, 56, 83, 40, 80, 70, 33], [41, 48, 72, 33, 47, 32, 37, 16, 94, 29], [53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14], [70, 11, 33, 28, 77, 73, 17, 78, 39, 68, 17, 57], [91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48], [63, 66, 4, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31], [4, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 4, 23]] def max_total(triangle): nrows = len(triangle) path = [[0] * (i + 1) for i in range(nrows)] path[0][0] = triangle[0][0] for i in range(1, nrows): path[i][0] = path[i-1][0] + triangle[i][0] for j in range(1, i): path[i][j] = max(path[i-1][j-1], path[i-1][j]) + triangle[i][j] path[i][i] = path[i-1][i-1] + triangle[i][i] return max(path[nrows-1]) print("数字三角形中的最大路径总和为:", max_total(triangle)) ``` 把这个程序复制到任何可以运行Python代码的环境中,运行它,您将得到数字三角形中所有路径中最大总和的结果。 ### 回答2: 这里给一个基于动态规划的解决方案,来找到从部到部的路径使路径上的数字总和最大。 首先,我们使用一个二维数组 dp[][] 来存储每个位置的最大数字总和。我们假设三角形的行数为 n。数组 dp 的大小应为 n * n。 我们可以观察到,对于三角形边上的数字,它们的最大数字总和就是它们自身的。 然后,我们从倒数第二行开始向上理,对于每个位置 (i, j),我们可以计算对应的 dp 为 dp[i][j] = triangle[i][j] + max(dp[i+1][j], dp[i+1][j+1])。也就是说,当前位置的最大数字总和等于该位置的加上下一行相邻位置中最大数字总和的较大。 最后,dp[0][0] 就是我们所需要的结果,即从部到部的路径使路径数字总和最大的。 下面是该问题的程序实现: ```python def max_path_sum(triangle): n = len(triangle) dp = [[0] * n for _ in range(n)] for i in range(n): dp[n-1][i] = triangle[n-1][i] for i in range(n-2, -1, -1): for j in range(i+1): dp[i][j] = triangle[i][j] + max(dp[i+1][j], dp[i+1][j+1]) return dp[0][0] ``` 注意,这里的 triangle 是一个二维列表,表给定的数字三角形。你可以将你的三角形输入该函数中进行计算。 希望对你有所帮助! ### 回答3: 这是一个典型的动态规划问题。我们可以使用一个二维数组dp来记录从的每个位置的最大路径和。 首先,我们将给数字三角形转化为一个二维数组triangle,其中triangle[i][j]表第i行第j列的数字。 然后,从倒数第二行开始,对每个位置triangle[i][j]计算其最大路径和,可以得到如下的推关系式: dp[i][j] = triangle[i][j] + max(dp[i+1][j], dp[i+1][j+1]) 通过这个推关系式,我们可以从向上计算每个位置的最大路径和。最终,dp[0][0]即为所求的从路径的最大和。 下面是一个完整的求解程序例: ```python triangle = [ [7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5] ] rows = len(triangle) dp = [[0] * rows for _ in range(rows)] for i in range(rows-1, -1, -1): for j in range(i+1): if i == rows-1: dp[i][j] = triangle[i][j] else: dp[i][j] = triangle[i][j] + max(dp[i+1][j], dp[i+1][j+1]) max_sum = dp[0][0] print("从路径的最大和为:", max_sum) ``` 上述程序中的数字三角形例为: ``` 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 ``` 输为:从路径的最大和为: 30,表路径7->3->8->7->5的和为30。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值