题目
#   逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学技能。 # 现在我们可以了解到,每个技能都有一个前提技能,只有学完了前提技能才能学习当前 # 的技能(有一个最根本的技能不需要前提技能)。学习每个技能要消耗一个技能点, # 然后可以获得这个技能的威力值。由于逗志芃要陪妹子,所以他希望你教他如何点技 # 能使得威力值最大从而成为强力党。

这个题的题目与介绍都挺中二的,我先概括一下:

有什么:有技能点,有技能,技能可提供威力

限制条件:有的技能需要前提技能,每个技能只能学习一次

要什么:要用有限的技能点,做出最大威力

思路

抽象思路:

在我看来这个技能明显是一个多叉树结构,再看加上技能点,我便想到了一个  多叉树形的递归 ,使用深度优先:

1,先建立一个多叉树结构,每一个技能是一个节点,用最根本的技能当根节点

2,建立一个递归函数dfs,每一个节点都会调用一次dfs,dfs会向自己的父节点返回自己的最大威力

总结:整个看起来就像是一个封建帝制国家 ,皇帝拿着钱分给下面大臣,大臣再拿钱分给下一级,每一级都会往自己上级报告最优情况,最终皇帝会得到最终结果

具体思路:

一:建立一个多叉树类,并用给出的技能建立多叉树,以下为案例:

3 2
1 10 20
1 2
1 3

建立的多叉树为

二:建立一个递归函数dfs,参数为(当前节点,剩余技能点),dfs会给当前节点的每一个子节点都进一次dfs,并找出当前节点的最优解。最优解为一个列表,【0技能点,1技能点,2技能点】

案例1:比如上面的案例,如果递归函数进入1也就是根节点,如果此时有 技能点 为3,那就可得最优解【1,21,31】。
案例2:如果是下面这个树,并且 技能点 为4那就可得最优解【1,21,41,61】。

  每一个节点进自己的递归函数的时候会像一个皇帝一样 权衡利弊 如果是如下的多叉树

设当前节点为根节点,假设他有3个技能点,他自己要用一个,剩下的2个,第一种情况:2个都给10,可获得31威力。第二种情况:给10一个,给30一个,会获得41威力。所以他会选择第二种情况。他将返回的列表【1,31,41】给自己的父节点,如果没有父节点,那么该列表的最后一项就是最终答案了。

代码:

####################################################################################2022.12.1 优化了空间
class node():def __init__(self, n, value):self.num = nself.v = valueself.son = []def add_son(self, s):self.son.append(s)def get_son(self, i):return self.son[i]def get_v(self):return self.v# 技能数量,技能点
n, m = map(int, input().split())
if m > n:  # 技能点不大于技能数量m = n
arr = [int(i) for i in input().split()]
node_arr = []  # 可以精准定位到某一个节点
for i in range(n):node_arr.append(node(i, arr[i]))for i in range(1, n):x, y = map(int, input().split())  # x是y的前提技能node_arr[x - 1].add_son(y - 1)###############################################################以上为准备工作(输入与搭建模型)。以下为树形dp
def dfs(p, m):  # p为当前节点,m为剩余技能点if m == 1:return [0,node_arr[p].get_v()]bp = [0 for i in range(m+1)]for i in range(len(node_arr[p].son)):  # 递归子表s = node_arr[p].get_son(i)  # s为当前子##以下要开始遍历子表以及刷新我表dp=dfs(s, m - 1)  # 得到子表for x in range(m - 1, 0, -1):#使用的技能点,因为先排除了自己所以是m-1开始for y in range(1,x + 1):#给当前子节点的bp[x+1] = max(bp[x+1], bp[x - y+1] + dp[y])#(保持当前值,部分技能点给其他子节点 剩下的给当前子节点)# 每个节点必须点自己。给自己表中每一项都补上自己for i in range(1, m + 1):bp[i] += node_arr[p].get_v()return bp##2个因为:
# 1 因为当前技能只能点一次,如果提前点好,那么在bp[x+1] = max(bp[x+1], bp[x - y+1] + dp[y])中会出现多个当前技能
# 2 因为bp[x]代表的是有x个技能点的最好情况,而当前技能必须点,所以bp【x要加一】
########################################################以下为输出部分
answer=dfs(0, m)
print(answer[m])

强力党逗志芃(蓝桥杯)python解法相关推荐

  1. 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-987 强力党逗志芃

    第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-987 强力党逗志芃 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-987 强力党逗志芃 前言 关于数学的疑问 算法训练 强 ...

  2. 蓝桥杯 算法训练 强力党逗志芃

    蓝桥杯 算法训练 强力党逗志芃 题目描述 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学技能.现在我们可以了解到,每个 ...

  3. 【蓝桥杯 算法训练】强力党逗志芃

    题目 题目链接 蓝桥杯 算法训练 强力党逗志芃 思路: 树形dp 定义状态: dp[i][j]表示以i为根,消耗j个技能点,最多能换取的v 状态转移方程: dp[pos][k]=max(dp[son] ...

  4. 蓝桥杯 强力党逗志芃 链式前向星结构的树形dp

    // 蓝桥杯 强力党逗志芃 // 采用树形dp,树以链式前向星形式存储#include <iostream> using namespace std;int power[205]; // ...

  5. 蓝桥杯 试题 算法训练 强力党逗志芃(C++)

    强力党逗志芃 题目浏览 算法代码 算法核心思路 题目浏览 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学技能.现在我们 ...

  6. 算法训练 强力党逗志芃

    算法训练 强力党逗志芃 目录 1.题目 2.输入格式 3.输出格式 4.代码部分 目录 代码分析2022/4/16补 1.题目 问题描述 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学 ...

  7. 蓝桥杯算法训练-强力党逗志芃

    持续更新蓝桥杯算法训练题解,有兴趣可以关注一波呀 题目 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学技能.现在我们可以了解到,每个技能都有一个前提技能,只有学完了前提技能才能学习当前 ...

  8. 试题 算法训练 强力党逗志芃

    问题描述 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学技能.现在我们可以了解到,每个技能都有一个前提技能,只有学完了前提技能才能学习当前的技能(有一个最根本的技能不需要前提技能).学 ...

  9. 蓝桥杯——算法基础 逗志芃的暴走PYTHON

    问题描述 逗志芃是有妹子的现充,但是有时候妹子就是烦恼.因为逗志芃太逗了,所以这段时间妹子对逗志芃发动了技能无理取闹,妹子要去玩很多的景点.由于逗志芃之前抽机花费了太多的时间,不久以后又要微积分考试了 ...

最新文章

  1. 华为p20可以用云闪付吗_华为hcIE有多难?零基础可以通过华为hcie认证吗?
  2. Javascript中for循环
  3. Worksheet.get_Range Method
  4. JS函数addEventListener的浏览器差异性封装
  5. Android官方技术文档翻译——Gradle 插件用户指南(5)
  6. C语言课后习题(8)
  7. innobackupex做MySQL增量备份及恢复
  8. API的 Signature(签名)Token(令牌) 认证
  9. linux selenium_Selenium的基本使用方法
  10. Android Studio实现音乐播放器2.0
  11. 历届美国梦之队战斗力汇总:梦一无敌 梦十二平淡
  12. 软工视频-----系统结构图
  13. 雅虎搜索架构_雅虎! 想要推动您的网站搜索
  14. AtCoder Beginner Contest 164 E Two Currencies【最短路】
  15. Android游戏集成豌豆荚支付
  16. 共享单车骑行数据分析数据来源
  17. java file delete 不及时_java中File的delete()方法刪除文件失敗的原因
  18. registerServiceWorker
  19. 纪中DAY5做题小结
  20. *5-2 CCF 2014-12-3 集合竞价

热门文章

  1. c语言扫描字符串,C语言字符串操作
  2. 电子行业激光雷达观察报告之Luminar篇:1550nm追风者-220424
  3. Minecraft纯净服开服
  4. Linux Shell 实现密码掩码输入
  5. 中国最有意境的33句诗文
  6. mysql忘记密码可以卸载重装吗
  7. java姓名排序_java、android拼音,中文姓名排序
  8. 3dMax模型布尔运算与建筑模型底图优化
  9. linux命令等号,linux 特殊符号大全
  10. 服务器与wsgi协议,wsgi