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

server/2025/1/18 2:32:23/

题目描述

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

输入

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

相关文章

C++实现设计模式---代理模式 (Proxy)

代理模式 (Proxy) 代理模式 是一种结构型设计模式,它为其他对象提供一个代理以控制对该对象的访问。代理模式常用于延迟加载、访问控制、智能引用等场景。 意图 提供对某对象的控制。控制对目标对象的访问,通常用于在不改变目标对象的情况下&#xff0…

【Flink系列】1.概述

1. Flink概述 1.1 Flink是什么 1.1.1 Flink是什么 Flink的官网主页地址:https://flink.apache.org/ 1.1.2 有界流和无界流 1.1.2 有状态流处理 1.1.3 Flink 的发展历史 1.2 Flink特点 1.3 Flink vs SparkStreaming 1.4 Flink 的应用场景 1.5 Flink 分层 API

深度学习camp-第J7周:对于ResNeXt-50算法的思考

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 📌你需要解决的疑问:这个代码是否有错?对错与否都请给出你的思考 📌打卡要求:请查找相关资料、逐步…

【认识油管头部频道】ep5 “5-Minute Crafts”——DIY 和生活技巧

5-Minute Crafts 是一个非常受欢迎的 DIY 和生活技巧频道,它的火爆有多方面的原因: 1. 简单实用的内容 视频主要以解决日常生活中遇到的小问题为主,提供简单易学的技巧,吸引了想快速获取实用知识的观众。 2. 短视频形式 每个视…

Elasticsearch技术标准解析与实践案例

一、引言 Elasticsearch(简称ES)是一个分布式、高扩展、高实时的搜索与数据分析引擎。它不仅能够进行全文搜索和分布式实时分析,还具备分布式的实时文档存储能力,支持上百个服务节点的扩展,并能处理PB级别的结构化或非结构化数据。本文旨在深入探讨Elasticsearch的技术原…

[Linux]——进程(2)

目录 ​编辑 一、前言 二、正文 2.1 进程状态 R/R状态 S状态 D状态 T/t状态 X状态 Z状态 2.2孤儿进程 2.3进程优先级 2.3.1基本概念 2.3.2PRI and NI 一、前言 在这一章,会为大家进行进程状态以及进程优先级的讲解 二、正文 2.1 进程状态 在一节中我们简…

idea上git log面板的使用

文章目录 各种颜色含义具体的文件的颜色标签颜色🏷️ 节点和路线 各种颜色含义 具体的文件的颜色 红色:表示还没有 git add 提交到暂存区绿色:表示已经 git add 过,但是从来没有 commit 过蓝色:表示文件有过改动 标…

视频点播共享系统项目

视频点播共享系统 一、项目功能二、开发环境三、技术特点四、项目模块1、数据管理模块2、网络通信模块3、业务处理模块4、前端界面模块 四、项目实现1、服务端工具类实现1.1 服务端工具类实现-文件实用工具类设计1.2 服务端工具类实现-Json实用工具类设计 2、服务端数据管理模块…