博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【递推】月落乌啼算钱
阅读量:6456 次
发布时间:2019-06-23

本文共 880 字,大约阅读时间需要 2 分钟。

洛谷的题目名称越来越瞎叉叉乱写了

思路


这道题看上去很高大上,但实际上一看(偷偷翻算法书)就知道这是某数列的通项公式(作为一个OIer,这是基本的数学素养,不懂者......退役吧)。

既然知道是斐波那契数列,那么,脱口而出:F(n)=F(n-1)+F(n-2),那么恭喜您,退役吧(这就是本蒟蒻的最初想法),为什么不行呢?大家构建一下递归树(栈)就知道了,递归层数本身会栈溢出不说,光是时间复杂度,和直接拿题目给的公式模拟的时间复杂度相当了,大约是O(nn),也就是说,您成功的吧O(n)的水题变成了NP完全问题,那么正解是什么呢?

其实注意一下题目的分类——递推,便可知道正解:F[n]=F[n-1]+F[n-2],看上去没什么区别对吗?那么恭喜您又可以退役了(非专业人士请走开),这样直接将时间降为线性,将空间也降为线性,但是,这是DP的思想,违背了题目的初衷(虽然已经能AC):递归,况且也不是最好的算法,所以——还需要优化。时间已降为线性,再要减也可以,但要用斐波那契堆,过于复杂,不展开了(不会),但空间可以降为O(1)——运用递推。

不多废话了,上代码(真正的程序员跟他讲解再多都没有直接上代码直观)。

Code


#include
using namespace std;long long a=1,b=1,c=0;///因为n<=48,所以大一点,用long longint n,i;int main(){ cin>>n; for (i=3;i<=n;i++) { c=a+b; a=b; b=c; } cout<
<<".00";///".00"是为了符合题意....... return 0;}

后记

等我学会斐波那契堆后再来继续优化吧,时间复杂度应该是可以降为O(log2n).

转载于:https://www.cnblogs.com/gongdakai/p/11031544.html

你可能感兴趣的文章
DMA32映射问题
查看>>
Android内存泄露之开篇
查看>>
leetcode-38 Count And Say
查看>>
提高效率—编程中的技巧
查看>>
导出excel——弹出框
查看>>
高并发程序设计
查看>>
ExtJs之组件(window)
查看>>
SoapUI中如何传递cookie
查看>>
shell中的一些技巧和知识
查看>>
eclipse 导出Runnable JAR file ,双击无法执行原因与解决 双击后闪退的原因 批处理java打包文件 @echo off start javaw -jar *.jar...
查看>>
静态成员变量的初始化
查看>>
POJ 1269 Intersecting Lines(判断两直线位置关系)
查看>>
MSSQL数据库跨表和跨数据库查询方法简(转)
查看>>
spring3.0.7中各个jar包的作用总结
查看>>
Windows 10 /win10 上使用GIT慢的问题,或者命令行反应慢的问题
查看>>
SSM——查询_分页
查看>>
梯度下降(Gradient descent)
查看>>
Windows平台分布式架构实践 - 负载均衡
查看>>
如何让LinearLayout也有类似Button的点击效果?
查看>>
JAVA读取文件方法大全
查看>>