洛谷_P1464 Function_python写法

目录

1.错误解法

2.学习记忆化搜索算法

2.1简介

2.2案例学习

3.解法

4.总结


1.错误解法

a = 0
b = 0
c = 0
def w(a,b,c):if a<=0 or b<=0 or c<=0:return 1elif a>20 or b>20 or c>20:return w(20,20,20)elif a<b and b<c:return w(a-1,b,c) + w(a-1,b,c) + w(a-1,b,c-1) -w(a-1,b-1,c-1)else:return w(a-1,b,c) + w(a-1,b-1,c) + w(a-1,b,c-1) - w(a-1,b-1,c-1)
while 1:a, b, c = map(int, input().split(' '))if a==-1 and b==-1 and c==-1:breakelse:print(f'w({a}, {b}, {c}) = {w(a,b,c)}')

 

直接按照题目地意思来做地话,就会超时。

怎么优化,我也不会,那就先去学习吧。再见

看到网上的C++解法说用的是记忆化搜索算法,那就先学习一下看看记忆化算法是个什么事儿。

2.学习记忆化搜索算法

2.1简介

        看完网上有挂记忆化算法的介绍之后,我的胡说八道是,记忆化算法是一种动态规划算法,它能够存储已经计算过的状态信息,避免造成重复计算,从而能够提高算法的效率。 

        看到网上有一个更加生动的解释,所谓的记忆化搜索可以理解为是拥有一个备忘录的递归,而记忆化的实现就是通过这个备忘录,在每次进入递归的时候都会先看看备忘录中是否已经计算了,如果没有就计算,有的话就可以直接使用。

2.2案例学习

思路:

1.定义一个备忘录;

2.每次进入递归,看看备忘录是否有;

3.如果没有,每次返回的时候,将计算的值加入备忘录中。

定义备忘录在python中我们可以利用列表来实现。

在定义列表的时候代码中用到了列表推导式,列表推导式

Python进阶:列表推导式(List Comprehension) - 知乎 (zhihu.com)

n = int(input())def fib(n):l = [0 for i in range(n+1)]return fib_helper(l,n)def fib_helper(l,n):if n == 0 or n == 1:return nif l[n] == 0:l[n] = fib_helper(l,n-1) + fib_helper(l,n-2)return l[n]else:return l[n]print(fib(n))

3.解法

         终于给写出来了,大家一定要认真看题目,计算错了让我找错误找了好久好久呜呜呜呜呜....

        我这里定义的备忘录就是一个三维的列表,关于三维列表的访问大家可以自己尝试写一个简单的三维列表,然后看看他是怎么访问的。

        关于内部的判断,如果按照以前的进行嵌套判断的话,还是会超时,所以就增加了一个并列条件:

elif l[a][b][c]:
        return l[a][b][c]

data = []
l = [[[0 for _ in range(21)] for _ in range(21)] for _ in range(21)]
def w_helper(a,b,c):if a <= 0 or b <= 0 or c <= 0:return 1elif a > 20 or b > 20 or c > 20:return w_helper(20,20,20)elif l[a][b][c]:return l[a][b][c]elif a<b and b<c:l[a][b][c] = w_helper(a,b,c-1) + w_helper(a,b-1,c-1) - w_helper(a,b-1,c)else:l[a][b][c] = w_helper(a-1,b,c) + w_helper(a-1,b-1,c) + w_helper(a-1,b,c-1) - w_helper(a-1,b-1,c-1)return l[a][b][c]while True:a, b, c = map(int, input().split(' '))data.append([a,b,c])if a == -1 and b == -1 and c == -1:data.pop()break
for i in data:print(f'w({i[0]}, {i[1]}, {i[2]}) = {w_helper(i[0], i[1], i[2])}')

4.总结

        理解这个算法并不难,就是要认真看题目,题目看错了一直以为是自己写的算法写错了,好在最后终于写出来了。

        以前学C++的时候其实就是没有耐心去学习,导致我一直都觉得很难,其实我对记忆化搜索算法的理解大概就是存储到列表(其他)遍历的算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/672116.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue源码系列讲解——变化侦测篇【下】(Array的变化侦测)

目录 1. 前言 2. 在哪里收集依赖 3. 使Array型数据可观测 3.1 思路分析 3.2 数组方法拦截器 3.3 使用拦截器 4. 再谈依赖收集 4.1 把依赖收集到哪里 4.2 如何收集依赖 4.3 如何通知依赖 5. 深度侦测 6. 数组新增元素的侦测 7. 不足之处 8. 总结 1. 前言 上一篇文…

Angular学习第三天--问题记录

问题一、 1.问题&#xff1a; An unhandled exception occurred: Unexpected token ?? See "C:\Users\22895\AppData\Local\Temp\ng-D60bgy\angular-errors.log" for further details. 2.原因&#xff1a; node版本过低&#xff0c;项目中angular是17&#xff0c;而…

神经网络 | CNN 与 RNN——深度学习主力军

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要将卷积神经网络&#xff08;CNN&#xff09;和循环神经网络&#xff08;RNN&#xff09;这两个深度学习主力军进行对比。我们知道&#xff0c;从应用方面上来看&#xff0c;CNN 用于图像识别较多&#xff0c;而 RNN 用于…

Abap与eCharts

一&#xff0c;简介 利用html与eCharts来绘图&#xff0c;然后用cl_gui_html_viewer将html呈现到abap屏幕中。 二&#xff0c;使用eCharts画图 在一个文件夹中准备如下文件&#xff0c;index.html和echarts.js是必须的&#xff0c;data.json(作为数据源)和jquery.js如果用到就可…

Linux系统中安装MAVEN

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

Python程序员面试题精选及解析(2)

本文精心挑选了10道Python程序员面试题&#xff0c;覆盖了Python的多个核心领域&#xff0c;包括装饰器、lambda函数、列表推导式、生成器、全局解释器锁(GIL)、单例模式以及上下文管理器等。每道题都附有简洁的代码示例&#xff0c;帮助读者更好地理解和应用相关知识点无论是对…

Rhino.Inside带材质将Revit模型bake到Rhino

Hello大家好&#xff01;我是九哥~ 今天来讲一个小技巧&#xff0c;就是我通常采用RIR将Revit的模型的Geometry Bake到Rhino&#xff0c;肯定是没有材质的&#xff0c;那么如果我们需要带材质那要怎么办呢&#xff1f; 对于会的人&#xff0c;其实挺简单的&#xff0c;只需要…

可解释性AI(XAI):开启AI决策过程透明化,重塑信任与解决伦理偏见

文章目录 每日一句正能量前言可解释性AI的定义与重要性什么是可解释性&#xff1f;促进技术应用的可信度提高技术的透明度保护隐私和数据权益促进AI的社会接受度 可解释性AI的挑战与难点可解释性AI的应用场景后记 每日一句正能量 宁可因高目标而脖子硬&#xff0c;也不要为低目…

Undertow使用详解

简介 Undertow是一个开源的、灵活的、高性能的非阻塞性应用服务器&#xff0c;由JBoss提供。它可以用作嵌入式服务器&#xff0c;也可以用作大型项目的全功能应用服务器。Undertow的设计以提供最高的性能和最大的灵活性为主要目标&#xff0c;支持非阻塞性和阻塞性处理方式&…

openkylin(Debian系)安装nginx及安装前需要的准备

前言 现在很多linux系统都可以使用高级包管理工具安装软件了&#xff0c;但是在像是 openkylin这些新系统中&#xff0c;好多软件包虽然有&#xff0c;但是因为其依赖的包还没有做好&#xff0c;所 以安装会提示你一大堆依赖错误。所以还是要自己来编译安装咯。安装前准备&…

RCS系统之:机器人状态

在设计RCS系统平台时&#xff0c;机器人总共设计状态有&#xff1a; 离线模式&#xff1b; 如图&#xff0c;18号机器人呈灰黑色&#xff0c;表示机器人没有上电状态 工作模式&#xff1b; 如图&#xff0c;10号机器人成绿色&#xff0c;表示机器人处于工作模式&#xff0c;等…

如何区分Linux中标准分区与lvm分区

以下是标准分区 以下包含lvm分区

Android14音频进阶:MediaPlayerService如何启动AudioTrack 上篇(五十五)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀 人生格言: 人生从来没有捷径,只…

TOML格式配置的frp服务搭建

从frp v0.52.0 版本开始&#xff0c;frp 将TOML作为配置文件格式。INI 格式已被弃用&#xff0c;并将在未来的发布中移除。因此&#xff0c;frp v0.52.0 及更高版本的配置文件默认为TOML格式。 项目地址 GitHub&#xff1a;https://github.com/fatedier/frp/releases 服务端…

离线场景下任意文档的在线预览及原样格式翻译,不依赖其他厂商接口非侵入式一行js代码实现网站的翻译及国际化,可配置使用多种翻译语言

离线场景下任意文档的在线预览及原样格式翻译&#xff0c;不依赖其他厂商接口非侵入式一行js代码实现网站的翻译及国际化&#xff0c;可配置使用多种翻译语言。 要实现翻译需要解决以下3个主要问题&#xff1a; 1&#xff09;from&#xff1a;内容本身的语言类型是什么&#xf…

别人还在集五福,星河社区开发者已经奖品拿到手软了!

AI新年新玩法你是否曾为AI应用的神奇而惊叹&#xff1f;你是否想过用AI为你定制新年写真&#xff1f;无需编程&#xff01;&#xff01; 飞桨星河社区帮你实现&#xff0c;还可赢取新年礼包&#xff01; 先速来看看攻略吧&#xff01;页面底部见活动详情。 玩法1攻略&#xff…

什么是UI设计?

用户界面&#xff08;UI&#xff09;它是人与机器互动的载体&#xff0c;也是用户体验&#xff08;UX&#xff09;一个组成部分。用户界面由视觉设计 (即传达产品的外观和感觉) 和交互设计 (即元素的功能和逻辑组织) 两部分组成。用户界面设计的目标是创建一个用户界面&#xf…

9.0 Zookeeper 节点特性

本章节介绍一下 zookeeper 的节点特性和简单使用场景&#xff0c;正是由于这些节点特性的存在使 zookeeper 开发出不同的场景应用。 1、同一级节点 key 名称是唯一的 实例&#xff1a; $ ls / $ create /runoob 2 已存在 /runoob 节点&#xff0c;再次创建会提示已经存在。 …

MySQL:从基础到实践(简单操作实例)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 下载前言一、MySQL是什么&#xff1f;二、使用步骤1.引入库2.读入数据 提交事务查询数据获取查询结果总结 下载 点击下载提取码888999 前言 在现代信息技术的世界…

Java基于微信小程序的医院挂号系统

文章目录 1 简介2 技术栈3 系统目标3.2 系统功能需求分析3.2.1 功能需求分析 4 系统模块设计4.1 数据库模块设计 5 系统的实现5.1 微信小程序个人中心5.2 科**室内容查看的实现**5.3 预约挂号的实现5.4 后台管理界面实现5.5 医生预约管理5.6 医生信息管理 参考文献7 推荐阅读8 …