算法刷题系列(四)蓝桥杯python算法训练3(下)
上一次的节点选择算法由于春节过年耽搁了,现在重新补上
上篇链接:算法刷题系列(四)蓝桥杯python算法训练3
- 经验教训
在纷繁复杂的使用了列表来暂存数据之后,发现其实可以利用笔者自己不太常用的字典遍历来减少内存占用,于是更新代码为:
n = int(input())
weight_list =[0] + list(map(int, input().split()))
aix_dict = {}
for i in range(1, n + 1):aix_dict[i] = []
for i in range(n - 1):a, b = list(map(int, input().split()))aix_dict[a].append(b)aix_dict[b].append(a)def deep_copy(temp_dict):dic = {}for key in temp_dict:dic[key] = temp_dict[key]return dicdef dp(temp_dict):score = 0for key in temp_dict:dic = deep_copy(temp_dict)for k in dic[key]:if k in dic.keys():del dic[k]del dic[key]temp_score = 0if dic == {}:temp_score = weight_list[key]else:temp_score = weight_list[key] + dp(dic)if score < temp_score:score = temp_scorereturn scoreprint(dp(aix_dict))
这其中可以发现:
1、直接将dict作为迭代器遍历和取出他的keys遍历是一样的。
2、删除字典中的元素应当使用del函数。
3、判断一个键是否在字典中原先应当使用has_key的方法,但是python3.7似乎没有这个方法,使用key in dict.keys()的效果是一样的。
然而优化后的结果在测试点执行的时候依旧存在超时的问题。因此开始研究树形DP。
- 树形DP
树形DP给我的启发是很大的,首先附上代码:
def dfs(node,pre):global value,tablefor i in table.get(node):if i !=pre:dfs(i,node)value[node][0]+=max(value[i][0],value[i][1])value[node][1]+=value[i][0]def main():global value, tablen = int(input())value = list(map(int, input().split()))value = list(map(lambda x:[0,x],value))value.insert(0,0)table = {}for i in range(n):table.update({i + 1: []})for i in range(n - 1):father, child = list(map(int, input().split()))table.get(father).append(child)table.get(child).append(father)dfs(1,0)print(max(value[1][0],value[1][1]))if __name__=='__main__':main()
这个DP算法当中,通过更新value[n][2]这个二维列表来获取结果,最终要的是根节点上的值。通过0和1这个长度为2的维度来表示是否选择该节点,第一个维度则是用来标识根的。因为是树,所以只要确定了根节点,就能够知道所有的可以选择的节点。
另外,当确定了根节点之后,其余所有子节点之间是不会相邻的,这一点非常重要。这是树形DP的最核心的所在。
并且在我自己尝试DP算法的写法的时候,总是莫名其妙写成了纯粹的递归。忽略了将数组与递归函数分开存放这一美妙的方法(我总是想着遍历递归函数的返回值需要返回数组,却没想到可以为void,然后全局更新)。
此题非常具有借鉴意义,值得仔细回味。
算法刷题系列(四)蓝桥杯python算法训练3(下)相关推荐
- 深度优先搜索dfs算法刷题笔记【蓝桥杯】
其实网上已经有不少dfs的算法笔记,但我之所以还再写一篇,主要是因为我目前见到的笔记,都有些太偏向理论了. 对于基础薄弱的或是没有基础的人(like me),有点不合适,因为看了,也不能说自己会了. ...
- 蓝桥杯python算法提高真题——幸运顾客
蓝桥杯python算法提高真题--幸运顾客 资源限制 时间限制:2.0s 内存限制:256.0MB 为了吸引更多的顾客,某商场决定推行有奖抽彩活动."本商场每日将产生一名幸运顾客,凡购买30 ...
- leetcode刷题可以用python吗_LeetCode刷题——第四天(python)
每天选壁纸做封面这个环节是我最喜欢的,今天的题目是比较经典又十分简单的一道题. 第四天--第四题(回文数) 请看题:判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整 ...
- 蓝桥杯 Python 算法训练 逗志芃的暴走
问题描述 逗志芃是有妹子的现充,但是有时候妹子就是烦恼.因为逗志芃太逗了,所以这段时间妹子对逗志芃发动了技能无理取闹,妹子要去玩很多的景点.由于逗志芃之前抽机花费了太多的时间,不久以后又要微积分考试了 ...
- 蓝桥杯 Python 算法训练 kAc给糖果你吃
问题描述 kAc有n堆糖果,每堆有A[i]个. kAc说你只能拿m次糖果,聪明的你当然想要拿最多的糖果来吃啦啦啦~ //第二天,kAc问你还想吃糖果么?(嘿嘿嘿)说着眼角路出奇怪的微笑... 输入格式 ...
- java算法提高 扫雷_Java实现 蓝桥杯VIP 算法提高 扫雷
算法提高 扫雷 时间限制:1.0s 内存限制:256.0MB 问题描述 扫雷游戏你一定玩过吧!现在给你若干个n×m的地雷阵,请你计算出每个矩阵中每个单元格相邻单元格内地雷的个数,每个单元格最多有8个相 ...
- 蓝桥杯经典算法 不定方程解法 蓝桥杯练习系统 历届试题 买不到的数目
蓝桥杯经典算法 第六讲 不定方程解法 蓝桥杯算法教学与培训_蓝桥杯经典算法 第六讲 不定方程解法 不定方程的一般解法 朴素算法 public static void main(String[] ...
- java 算法提高 邮票面值设计 蓝桥杯1046
java 算法提高 邮票面值设计 蓝桥杯1046 算法提高 邮票面值设计 思路 代码 算法提高 邮票面值设计 Description 给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤13) ...
- 蓝桥杯Python这一篇就够了-训练系统题库合集(包括VIP试题)数据结构与算法
第一版写于2020-11-13,第十一届蓝桥杯国赛前夕,老师和同学建议说写博文可以让学习更高效,陆陆续续写一些题解和学习笔记,在我的代码中我加了很多有助于理解程序的注释,希望这篇博客可以帮助你在蓝桥杯 ...
最新文章
- 2月书讯 | 冬奥结束看什么?看看“天花板”级别新作!
- mysql 自定义提示符
- java jaspersoft,Jaspersoft Studio
- hibernate添加spring 事务管理注意问题记录
- mmap从低向高增长的legacy模式和从高向低增长的modern模式
- java 记事本全选_java 编写的记事本程序怎么实现复制 黏贴 剪切 全选的功能 ?...
- android在搭建框架时要注意,Android开发搭建应用框架步骤和注意的问题
- 进入多个页签_俄罗斯学生落地签如何办理?
- 软件以人为本1 - 序 - 写于上海2011 ScrumGathering会后
- 智能优化算法:哈里斯鹰算法-附代码
- Instruments-Automation: 通过命令行执行测试用例
- 离散数学期末复习—学习笔记
- MATLAB里根号打印,里根号
- excel自动调整列宽_Excel教程:A股上了3000点,来张股市涨跌图
- 盖茨与鲍尔默愤而诉Google 李开复离职有内情 -- ,买skype来控制桌面建立渠道吧
- Cadence仿真笔记:MOS的参数名称解释
- 兵法三十六计是哪些?
- 工业镜头景深计算及工业镜头技术分析
- krita windows编译源码
- Java Web应用开发
热门文章
- CryEngine3中的AI组件对象
- Linux下nano编辑器的快捷键使用
- 服务器304响应,网络---关于HTTP 304状态码的理解-Go语言中文社区
- 想领跑工业“F1”?我们为您带来6大“弯道超车”技巧
- Javaswing+MySQL实现超市收银管理系统(含源码、包运行)
- sublime text + LaTex 写作生成PDF | LaTex代码自动补全工具 | MiKTeX安装宏包
- 服务器压力测试 性能测试 AB、Webbench、Tsung
- 数字化和管理哲学 | 中国企业为啥用不好ERP却信中台和阿米巴
- 如何解读《微信技术总监谈架构:微信之道——大道至简》
- 无线打印服务器app,双频无线路由器打印服务器客户端软件_1.14.0613 (Windows)