强力党逗志芃(蓝桥杯)python解法
题目
# 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学技能。 # 现在我们可以了解到,每个技能都有一个前提技能,只有学完了前提技能才能学习当前 # 的技能(有一个最根本的技能不需要前提技能)。学习每个技能要消耗一个技能点, # 然后可以获得这个技能的威力值。由于逗志芃要陪妹子,所以他希望你教他如何点技 # 能使得威力值最大从而成为强力党。
这个题的题目与介绍都挺中二的,我先概括一下:
有什么:有技能点,有技能,技能可提供威力
限制条件:有的技能需要前提技能,每个技能只能学习一次
要什么:要用有限的技能点,做出最大威力
思路
抽象思路:
在我看来这个技能明显是一个多叉树结构,再看加上技能点,我便想到了一个 多叉树形的递归 ,使用深度优先:
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解法相关推荐
- 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-987 强力党逗志芃
第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-987 强力党逗志芃 目录 第十四届蓝桥杯集训--练习解题阶段(无序阶段)-ALGO-987 强力党逗志芃 前言 关于数学的疑问 算法训练 强 ...
- 蓝桥杯 算法训练 强力党逗志芃
蓝桥杯 算法训练 强力党逗志芃 题目描述 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学技能.现在我们可以了解到,每个 ...
- 【蓝桥杯 算法训练】强力党逗志芃
题目 题目链接 蓝桥杯 算法训练 强力党逗志芃 思路: 树形dp 定义状态: dp[i][j]表示以i为根,消耗j个技能点,最多能换取的v 状态转移方程: dp[pos][k]=max(dp[son] ...
- 蓝桥杯 强力党逗志芃 链式前向星结构的树形dp
// 蓝桥杯 强力党逗志芃 // 采用树形dp,树以链式前向星形式存储#include <iostream> using namespace std;int power[205]; // ...
- 蓝桥杯 试题 算法训练 强力党逗志芃(C++)
强力党逗志芃 题目浏览 算法代码 算法核心思路 题目浏览 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学技能.现在我们 ...
- 算法训练 强力党逗志芃
算法训练 强力党逗志芃 目录 1.题目 2.输入格式 3.输出格式 4.代码部分 目录 代码分析2022/4/16补 1.题目 问题描述 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学 ...
- 蓝桥杯算法训练-强力党逗志芃
持续更新蓝桥杯算法训练题解,有兴趣可以关注一波呀 题目 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学技能.现在我们可以了解到,每个技能都有一个前提技能,只有学完了前提技能才能学习当前 ...
- 试题 算法训练 强力党逗志芃
问题描述 逗志芃励志要成为强力党,所以他将身上所以的技能点都洗掉了重新学技能.现在我们可以了解到,每个技能都有一个前提技能,只有学完了前提技能才能学习当前的技能(有一个最根本的技能不需要前提技能).学 ...
- 蓝桥杯——算法基础 逗志芃的暴走PYTHON
问题描述 逗志芃是有妹子的现充,但是有时候妹子就是烦恼.因为逗志芃太逗了,所以这段时间妹子对逗志芃发动了技能无理取闹,妹子要去玩很多的景点.由于逗志芃之前抽机花费了太多的时间,不久以后又要微积分考试了 ...
最新文章
- 华为p20可以用云闪付吗_华为hcIE有多难?零基础可以通过华为hcie认证吗?
- Javascript中for循环
- Worksheet.get_Range Method
- JS函数addEventListener的浏览器差异性封装
- Android官方技术文档翻译——Gradle 插件用户指南(5)
- C语言课后习题(8)
- innobackupex做MySQL增量备份及恢复
- API的 Signature(签名)Token(令牌) 认证
- linux selenium_Selenium的基本使用方法
- Android Studio实现音乐播放器2.0
- 历届美国梦之队战斗力汇总:梦一无敌 梦十二平淡
- 软工视频-----系统结构图
- 雅虎搜索架构_雅虎! 想要推动您的网站搜索
- AtCoder Beginner Contest 164 E Two Currencies【最短路】
- Android游戏集成豌豆荚支付
- 共享单车骑行数据分析数据来源
- java file delete 不及时_java中File的delete()方法刪除文件失敗的原因
- registerServiceWorker
- 纪中DAY5做题小结
- *5-2 CCF 2014-12-3 集合竞价