2021年第十二届蓝桥杯省赛Python组(真题+解析+代码):儿子兄弟

1 真题


2 解析

难度系数:⭐⭐⭐

考察题型:数据结构 动态规划

涉及知识点:二叉树 树型DP

思路分析:

没有思路肿么办?先暴力破解试试看吧!时间超了也有15分能拿。

先根据题目思路,定义一个树节点类,再初始化结点。

定义一个递归函数,求树的最大高度,最后遍历即可。

一步步转化,求二叉树最高高度->孩子结点个数


3 代码

#树形结构版
#定义结点类
class node():
    def __init__(self,val):
        self.val=val        #父结点值
        self.child=[]       #结点孩子
tree=[None,node(val=0)]     #初始化树
#初始化树列表
n=int(input())
for i in range(2,n+1):     
    m=int(input())
    tree.append(node(val=m))
    tree[m].child.append(i)
#最大长度-递归函数
def maxlen(n:node):
    if len(n.child)==0:    #无孩子,高度为0
        return 0
    else:
        return len(n.child)+max(maxlen(tree[temp]) for temp in n.child)
print(maxlen(tree[1]))      #从根节点开始遍历
#二维列表法
a = [[]for i in range(100001)]  #测试数据最大为十万
n = int(input())                #测试数量:5
for i in range(2, n + 1):       #结点编号:2,3,4,5
    fu = int(input())           #输入父节点:1,1,1,2
    a[fu].append(i)             #测试结果:[[], [2, 3, 4], [5], [],[]]
#树型DP
def dfs(t):
    ans = 0
    for i in range(len(a[t])):  #t:1 len:3 i:0,1,2
        ans = max(ans, dfs(a[t][i])+len(a[t]))
    return ans
print(dfs(1))

   📍我写的是关于蓝桥杯的系列题解,感谢关注我的朋友们,我会持续输出高质量文章💪🏻   

蓝桥杯python组十二届省赛真题+解析+代码(通俗易懂版)_编程有了思路-CSDN博客_蓝桥杯大赛python小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。小蓝想知道自己能从 1 拼到多少。例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10,但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1拼到多少?https://blog.csdn.net/m0_55148406/article/details/122774029

  • 6
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蓝刷题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值