学习日记—递推
作者:互联网
递推学习笔记:
一、什么是递推
递推算法是一种较为简单的算法,即通过已知条件,利用特定关系得出中间推论,直至得到结果的算法。递推算法分为顺推和逆推两种。
二、典型例题
1.(正推)P1720 月落乌啼算钱(斐波那契数列)洛谷传送门
题目背景
(本道题目木有隐藏歌曲……不用猜了……)
《爱与愁的故事第一弹·heartache》最终章。
吃完 pizza,月落乌啼知道超出自己的预算了。为了不在爱与愁大神面前献丑,只好还是硬着头皮去算钱……
题目描述
算完钱后,月落乌啼想着:“你 TMD 坑我,(以下用闽南语读)归粒靠杯靠亩诶,(以下用英读)是伊特游!”于是当爱与愁大神问多少钱时,月落乌啼说了一堆乱码。爱与愁大神说:“算了算了,我只问第n样菜价格多少?”月落乌啼写出了:
由于爱与愁大神学过编程,于是就用 1 分钟的时间求出了Fn 的结果。月落乌啼为此大吃一惊。你能学学爱与愁大神求出 Fn 的值吗?
输入格式
一行一个自然数n。
输出格式
只有1行一个实数Fn,保留两位小数。
理性分析一下
答:不能
这题看起来花里胡哨,但一看题目“斐波那契数列”,思路一下就清晰了,这个证明过程网上一搜一大堆我就不一一叙述了(主要是作者不会),言归正传,既然是一道递推题,那肯定要找递推式,很幸运斐波那契数列的特点便是递推公式,即:
f[i]=f[i-1]+f[i-2](i>2),f[i]=1(i<=2)
废话不多数上代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 ll n,a=1,b=1,c=1; 5 int main() { 6 cin>>n; 7 if(!n){//特判一下0 8 cout<<"0.00"; 9 return 0; 10 } 11 for(int i=3;i<=n;i++){ 12 //一个优化,其实用数组也行 13 c=a+b; 14 a=b; 15 b=c; 16 } 17 cout<<c<<".00"; 18 return 0; 19 }
其实还可以打表,但比赛中不是什么好方法,所以不赘述了
2.(逆推)忘了叫什么名了
题目描述
有一种细胞叫做A(忘名了),所有这种细胞每1分钟繁殖一个和自己一摸一样的细胞,有一个培养皿,可以容纳2^20个这种细胞,现在19分钟后培养皿满了,最开始培养皿里有多少个细胞?
分析
“所有这种细胞每1分钟繁殖一个和自己一摸一样的细胞”这句话一看好像不太明白什么意思,其实这句话就等于细胞数每分钟翻1倍,也就是乘以2,这样这个问题就简单多了,就是一个小学奥数题,不废话,上代码
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll a=1; int main() { for(int i=1;i<=20;i++)a=a*2;//容器最多能装多少 for(int i=1;i<=19/1;i++)a=a/2;//一点一点往后推 cout<<a; //虽然这个程序十分无用,但是一个典型易懂的倒推 return 0; }
三、DEV-C++开栈
大家再做一些DFS的题时可能有遇到过这样的情况:在自己的编译器上跑一些样例,编译器跑一会就停了下来,下面还有一堆返回值,BUG找了半天没找到,但抱着生无可恋的心理一交,结果AC了,此时内心的激动想必大家都理解。但为什么编译器上跑不行交答案就对了呢?难道是因为数据太水?显然不是。这是因为你的DFS递归太多,爆系统栈编译器强制给你停了,那解决方法也很简单,那就是开栈,具体步骤如下:
在(工具->编译选项->编译器(勾选“编译时加入以下命令”))中加入:-Wl,--stack=512000000 并勾选“确定”即可,就像下图一样便可以了
注意:开栈时别开太大我这个就已经接近512MB了,开太大如过写递归时没返回值,电脑会卡到连声音和图像加载模块都卸载掉,甚至会死机,这样你只能强制关机,而你的代码是否还留的住就随缘了,本人之前就开过10G的栈,结果DFS没return直接死机。
最后本人如果博客写的有误或你觉得还不够好欢迎批评指出,还有都看到这里还不点个赞吗?
标签:ll,细胞,学习,月落乌啼,编译器,long,递推,日记 来源: https://www.cnblogs.com/2009cqr/p/16436971.html