蓝桥杯第十一届省赛——数字三角形(python组)

这篇具有很好参考价值的文章主要介绍了蓝桥杯第十一届省赛——数字三角形(python组)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目:数字三角形

【问题描述】:

上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最

大的和。

路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右

边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。

【输入格式】

输入的第一行包含一个整数 N (1 < N ≤ 100),表示三角形的行数。下面的

N 行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。

【输出格式】

输出一个整数,表示答案。

【样例输入】

5

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

【样例输出】

27
 

问题分析

我们的目的是寻求路径的最大和,一步步的往下移,找到每一步的最优解,不由而然我们可以想到动态规划法,此时注意题目的限制条件向左下走的次数与向右下走的次数相差不能超过 1。一次慢慢寻找每一步的最优解(也就是每走一步的最大路径),一直到最后一步的时候,再求出这一步的最优解(也就是最后一步的路径最大值)。

问题答案

    n = int(input())
    matrix = list()
    for i in range(n):
        # 使用map函数将输入的字符串中的数字转为int类型, 使用list方法将其转换为一个列表
        matrix.append(list(map(int, input().split())))
    dp = [[0] * n for i in range(n)]
    dp[0][0] = matrix[0][0]
    for i in range(1, n):
        for j in range(i + 1):
            # 每行第一个元素
            if j == 0:
                dp[i][j] = dp[i - 1][j] + matrix[i][j]
            # 每行最后一个元素
            elif j == i:
                dp[i][j] = dp[i - 1][j - 1] + matrix[i][j]
            else:
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + matrix[i][j]
    #此时注意题目还有限制条件(往右走和往左走相差不能超过1)
    # 最后判断n是奇数还是偶数来返回对应的值
    # 奇数肯定是最中间的那个值偶数肯定是中间两个较大值
    print(dp[n - 1][n // 2] if n % 2 == 1 else max(dp[n - 1][n // 2 - 1], dp[n - 1][n // 2]))

代码分析

输入数字三角形

    n = int(input())
    matrix = list()
    for i in range(n):

        matrix.append(list(map(int, input().split())))

无容置疑这一段代码是为了输入格式,将需要输入的三角形由矩阵转换成列表

  [[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]]

如果对代码有什么不懂的地方可以自行查找map,list,split,append函数的解释

生成一个dp全零矩阵---用于保存最优解

    dp = [[0] * n for i in range(n)]
    dp[0][0] = matrix[0][0]
dp = [[0] * n for i in range(n)]很多人会对这个不怎么明白,其实就是生成N x N 的二维矩阵如下:
#n=5时也就是生成这样一个矩阵用来保存每一步dp的最优解
dp = [[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0],[0,0,0,0,0]]

 代码过程

蓝桥杯第十一届省赛——数字三角形(python组)

 

 

for i in range(1, n):
        for j in range(i + 1):
            # 每行第一个元素
            if j == 0:
                dp[i][j] = dp[i - 1][j] + matrix[i][j]
            # 每行最后一个元素
            elif j == i:
                dp[i][j] = dp[i - 1][j - 1] + matrix[i][j]
            else:
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + matrix[i][j]

由上图看知道代码的运算过程,可以通过自己带入运算,从我手写的图片可以看出,运算有三种情况,也就是每行开头的第一个数字,还有最后一个数字是不需要比较的,但是当需要比较的那一步比较大的时候我们需要增加一个else,这样就可以得到每一步得最优解。

答案

错误答案

许多人会通过以下代码去寻找最优解,但是忽略了一个条件就是:向左下走的次数与向右下走的次数相差不能超过 1。

print(max(dp[4][0],dp[4][1],dp[4][2],dp[4][3],dp[4][4]))

正确答案

因为这个限制条件,所以当n为奇数得时候那肯定就是最后一步最优解得中间值,如果n为偶数得时候,最优解就要通过中间得两个值进行比较。

#此时注意题目还有限制条件(往右走和往左走相差不能超过1)
    # 最后判断n是奇数还是偶数来返回对应的值
    # 奇数肯定是最中间的那个值偶数肯定是中间两个较大值
    print(dp[n - 1][n // 2] if n % 2 == 1 else max(dp[n - 1][n // 2 - 1], dp[n - 1][n // 2]))

总结

文章比较繁琐,且文字多,刚刚学习蓝桥杯的同学一步一步慢慢带入数据就可以很快的掌握与理解文章来源地址https://www.toymoban.com/news/detail-409180.html

到了这里,关于蓝桥杯第十一届省赛——数字三角形(python组)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第十一届国际分子模拟与人工智能应用学术会议 (2023-ICMS&AI)

    作为国内历史悠久、分子模拟领域公认的高水平国际学术会议,国际分子模拟与人工智能应用学术会议重磅回归。经过两年的精心筹备,本次会议将于 2023年5月6日-7日 在 成都 隆重举行,本次大会将为国内外从事分子模拟人工智能应用和研发创新数字化转型的企业、高校、科

    2023年04月26日
    浏览(58)
  • 2020年第十一届蓝桥杯省赛+解析(门牌制作、寻找2020、跑步锻炼、蛇形填数、排序、成绩统计、单词分析)

    目录 门牌制作 寻找2020 跑步锻炼 蛇形填数 排序 成绩统计

    2023年04月08日
    浏览(50)
  • [蓝桥杯单片机]——八到十一届初赛决赛客观题

     采用外部12MHz晶振,经过系统12分频时定时器获得最大定时长度,此时定时器定时脉冲为1MHz,周期为1s,而定时器计时均为 16位加法计数器,即计时长度为。 ①带阻滤波器是指能通过大多数频率分量、但将某些范围的频率分量衰减到极低水平的滤波器 ②低通滤波器是容许低

    2023年04月09日
    浏览(48)
  • 数字三角形+包子凑数(蓝桥杯JAVA解法)

    题目描述 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和(路径上的每一步只可沿左斜线向下或右斜线向下走)。 输入描述 输入的第一行包含一个整数 N (1≤N≤

    2024年02月01日
    浏览(37)
  • 第十二届蓝桥杯单片机省赛

    直接复制粘贴然后运行 然后打开stc烧录到开发板上面就能用 程序哪里不懂的话问我,我闲的蛋疼! #include STC15F2K60S2.H #include intrins.h unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0xff,0xc6,0x8c,0x88}; unsigned char yi,er,san,si,wu,liu,qi,ba; l

    2023年04月09日
    浏览(51)
  • 第十三届蓝桥杯省赛Python 组

    本次所有代码均存放于仓库: Github :GxlHus/Algorithm at 蓝桥杯 (github.com) Gitee :Algorithm: 算法解题 - Gitee.com 原题目:第十三届蓝桥杯大赛软件赛省赛_PB.pdf · AYO/Algorithm - Gitee.com 本次省赛题目总体来说不难,总体质量比较高,尤其是后边几道题,虽然能轻易做出来,但是想跑通所

    2023年04月17日
    浏览(45)
  • 数字三角形-蓝桥杯真题动态规划PYTHON解法

    目录 题目描述  解题思路 DP初始化 DP最终条件 DP初始条件 题目限制条件 总代码 首先映入我们眼帘的就是一个三角形,加求路径和最大,类似于找最短路径的题,很明显是一个二维数组的动态规划问题,对于动态规划问题我们只需要找好最终条件,初始条件(也就是特殊条件

    2024年02月09日
    浏览(36)
  • 2019 第十届蓝桥杯省赛A组题解

    本次试题难度(对专业算法竞赛选手来说)不大,但是考验基本的编程基本功和数学思维。估计完成80%即可获得省一进入决赛(根据一些公开的反馈,如果有准确数据请告诉我),因此更多的是需要细心。 至于C/C++还是Java我觉得不重要,因为题目除了顺序有点不同,内容是一

    2023年04月09日
    浏览(46)
  • 4 -【第十二届】蓝桥杯物联网试题 (省赛题)

    1.将时钟树频率设置成32MHz 2.将GPIO引脚做如下配置: 引脚功能 使能ADC功能 使能RTC功能 3.生成工程代码 4.移植OLED、LoRa库文件 5.编写逻辑代码 自定义Task_Main.h Task_Main.c工程文件 Task_Main.h Task_Main.c main.c 引入头文件 板级初始化 主控代码 1.将时钟树频率设置成32MHz 2.将GPIO引脚做如

    2023年04月10日
    浏览(51)
  • 蓝桥杯嵌入式第十届省赛真题

    总的来说这题考点特别的少,逻辑也比我之前发的12届的停车计费简单得多,还是一样 代码结尾自取。完全免费 相对来说能从这题学到的。对我来说我觉得是 封装一些“状态”数组 。可以让代码的可读性和复用性高很多。 思路其实很简单,就是切换界面和获取adc的值,并和

    2023年04月22日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包