算法竞赛(蓝桥杯)贪心算法1——数塔问题

news/2025/1/18 16:54:20/

题目描述

有如下所示的数塔,要求从底层走到顶层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

输入

输入数据首先包括一个整数整数 N (1≤N≤100),表示数塔的高度,接下来用 N 行数字表示数塔,其中第i 行有个i 个整数,且所有的整数均在区间 [0,99] 内。

输出

从底层走到顶层经过的数字的最大和是多少?

样例

输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出
30

题解

1. 导入必要的模块

没有导入任何模块,因为它使用了标准的输入输出函数 input()print()

2. 读取输入数据

Python复制

n = int(input())

这行代码读取一个整数 n,表示数字三角形的行数。

3. 初始化数字三角形

Python复制

a = []
for i in range(n):a.append(list(map(int, input().split())))

这段代码读取 n 行输入,每行包含若干个整数,构成数字三角形。这些整数被存储在一个二维列表 a 中。

4. 动态规划求解最大路径和

Python复制

for i in range(n-2, -1, -1):for j in range(i + 1):  # 确保遍历第i行的i+1个元素a[i][j] = max(a[i][j] + a[i+1][j], a[i][j] + a[i+1][j+1])

这段代码是动态规划的核心部分。它从倒数第二行开始,自底向上更新每一行的元素值。具体步骤如下:

  • 外层循环for i in range(n-2, -1, -1) 从倒数第二行开始,逐行向上遍历,直到第一行。

  • 内层循环for j in range(i + 1) 遍历当前行的每个元素。第 i 行有 i + 1 个元素。

  • 更新元素值a[i][j] = max(a[i][j] + a[i+1][j], a[i][j] + a[i+1][j+1]) 将当前元素 a[i][j] 与下一行的两个相邻元素 a[i+1][j]a[i+1][j+1] 中的较大值相加,更新 a[i][j]

5. 输出结果

Python复制

print(a[0][0])

最后,输出数字三角形顶部的元素 a[0][0],它包含了从顶部到底部的最大路径和。

示例

假设输入如下:

复制

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
  • n = 5 表示数字三角形有5行。

  • 数字三角形如下:

复制

     73 88 1 02 7 4 44 5 2 6 5

按照动态规划的步骤,我们从倒数第二行开始计算:

  • 第4行(倒数第二行):

    • a[3][0] = 2 + max(4, 5) = 2 + 5 = 7

    • a[3][1] = 7 + max(5, 2) = 7 + 5 = 12

    • a[3][2] = 4 + max(2, 6) = 4 + 6 = 10

    • a[3][3] = 4 + max(6, 5) = 4 + 6 = 10

  • 第3行:

    • a[2][0] = 8 + max(7, 12) = 8 + 12 = 20

    • a[2][1] = 1 + max(12, 10) = 1 + 12 = 13

    • a[2][2] = 0 + max(10, 10) = 0 + 10 = 10

  • 第2行:

    • a[1][0] = 3 + max(20, 13) = 3 + 20 = 23

    • a[1][1] = 8 + max(13, 10) = 8 + 13 = 21

  • 第1行:

    • a[0][0] = 7 + max(23, 21) = 7 + 23 = 30

最终,a[0][0] 的值为 30,表示从顶部到底部的最大路径和为 30。

总结

通过自底向上的动态规划方法,我们可以高效地求解数字三角形的最大路径和。这种方法的时间复杂度为 O(n^2),适用于处理较大规模的数字三角形。希望这篇文章能帮助你更好地理解这段代码的工作原理和实现细节。

 完整代码

python">a=[]
for i in range(n):a.append(list(map(int,input().split())))
for i in range(n-2,-1,-1):for j in range(i+1):# 确保遍历第j行有i个元素,因为range(0)无法进入循环a[i][j]=max(a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1])
print(a[0][0])

http://www.ppmy.cn/news/1564194.html

相关文章

Axios 封装:处理重复调用与内容覆盖问题

问题描述&背景 下拉选择框,支持搜索,搜索时携带参数调用接口并更新下拉选项下拉选择连续进行多次搜索,先请求但响应时间长的返回值会覆盖后请求但响应时间短的举例: 搜索后先清空选项,再输入内容进行搜索。清空后…

架构设计:微服务还是集群更适合?

在现代软件开发中,微服务和集群是两种广泛应用的架构设计方案。随着系统需求的不断复杂化和规模的扩大,选择一种适合的架构对系统的性能、可维护性和扩展性至关重要。那么,在架构设计中,是选择微服务还是集群更适合?本…

文件上传 分片上传

分片上传则是将一个大文件分割成多个小块分别上传,最后再由服务器合并成完整的文件。这种做法的好处是可以并行处理多个小文件,提高上传效率;同时,如果某一部分上传失败,只需要重传这一部分,不影响其他部分…

c++领域展开第十三幕——类和对象(auto、范围for以及string类的初步讲解)超详细!!!!

文章目录 前言一、auto和范围for二、string类2.1 string类(了解)2.2 string类的常用接口说明2.2.1 string类对象的常见构造2.2.2 string类对象的容量操作 总结 前言 上篇博客我们了解了STL,今天我们来学习string类的一些初始内容,另外,在stri…

【深度学习】Pytorch:自实现残差网络

ResNet(残差网络)是由何凯明等人在2015年发表的论文《深度残差学习用于图像识别》中提出的一种开创性深度学习架构。它在ILSVRC 2015分类任务中获胜,并解决了深度神经网络中的退化问题,使得训练数百甚至数千层的网络成为可能。 残…

reac 后端接口返回二进制文件流前端导出文件

axios配置 在你的请求中加入 responseType:blob导出函数 export interface DownloadFileOptions {filename: string; //文件名称}/*** 下载二进制文件流* param data - 二进制数据* param options - 下载配置*/export const downloadBinaryFile1 (data: any, // 这里使用 a…

3.数据库系统

3.1数据库的基本概念 3.1.1:数据库体系结构 3.1.1.1集中式数据库系统 数据是集中的 数据管理是集中的 数据库系统的素有功能(从形式的用户接口到DBMS核心)都集中在DBMS所在的计算机 3.1.1.2C/S结构 客户端负责数据表示服务服务器主要负责数据库服务 数据库系统分为前端和后端…

D3.js及实例应用

文章目录 D3.jsd3.js 应用实例图标展示点击选择拖拉拽应用 D3.js D3.js是一个功能强大的JavaScript库,除了图标展示,还能实现多种类型的交互效果: 数据可视化交互 动态更新图表:根据用户操作(如点击按钮、选择下拉菜…