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

devtools/2025/1/17 13:00:51/

题目描述

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

输入

输入数据首先包括一个整数整数 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/devtools/151278.html

相关文章

【Linux探索学习】第二十六弹——进程通信:深入理解Linux中的进程通信

Linux探索学习: https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言: 在Linux操作系统中,进程通信(IPC)是操作系统的一项核心功能,用于在不同进程之间交换数据或…

(01)STM32—GPIO

1. GPIO简介 GPIO(General Purpose Input Output)通用输入输出端口。可配置为8种输入输出模式。引脚电平:0V~3.3V,部分引脚可容忍5V。输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时…

FPGA工程师成长四阶段

朋友,你有入行三年、五年、十年的职业规划吗?你知道你所做的岗位未来该如何成长吗? FPGA行业的发展近几年是蓬勃发展,有越来越多的人才想要或已经踏进了FPGA行业的大门。很多同学在入行FPGA之前,都会抱着满腹对职业发…

Gartner预测2025年关键基础设施的CPS安全:确保机器人、无人机、自动驾驶汽车、人工智能等前沿技术应用和新场景安全

增强人类能力技术、无人机、自动驾驶汽车、人工智能和量子集成资产等技术创新正在推动网络物理系统在所有行业中进入新领域。本报告可帮助安全和风险管理领导者预测并为 CPS 安全的未来做好准备。 主要发现 移动专网正成为信息物理系统 (CPS) 自动化工作更具吸引力的选择。这是…

Vue.js组件开发-如何实现路由懒加载

在Vue.js应用中,路由懒加载是一种优化性能的技术,它允许在需要时才加载特定的路由组件,而不是在应用启动时加载所有组件。这样可以显著减少初始加载时间,提高用户体验。在Vue Router中,实现路由懒加载非常简单&#xf…

解析英文单词“Pitfall”及其用法

解析英文单词“Pitfall”及其用法 一、引言 在学习英语的过程中,我们常常遇到一些看似简单却极具挑战性的词汇。在这些词汇中,“pitfall”是一个非常有意思的词,它不仅有深刻的含义,而且在许多场合下都能派上用场。今天&#xf…

基于SpringBoot2+MybatisPlus+SpringSecurity+jwt+redis+Vue技术的在线商城系统设计与实现

博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c等开发语言,以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架…

【airtest】自动化入门教程Poco元素定位

1. 前言 本文将详细讲解Poco控件定位的各种方式,利用这些方法可以帮助我们编写出目标控件的定位脚本。我们在IDE录制的poco脚本,常见的都是类似 poco(“star_single”).click()这样的脚本,其中 poco(“star_single”) 这块就属于Poco控件定位…