P1720 月落乌啼算钱(斐波那契数列)

题目传送门

先看一下题目:

题目背景

(本道题目木有隐藏歌曲……不用猜了……)

《爱与愁的故事第一弹·heartache》最终章。

吃完 pizza,月落乌啼知道超出自己的预算了。为了不在爱与愁大神面前献丑,只好还是硬着头皮去算钱……

题目描述

算完钱后,月落乌啼想着:“你 TMD 坑我,(以下用闽南语读)归粒靠杯靠亩诶,(以下用英读)是伊特游!”于是当爱与愁大神问多少钱时,月落乌啼说了一堆乱码。爱与愁大神说:“算了算了,我只问第n样菜价格多少?”月落乌啼写出了:

斐波那契数列公式

由于爱与愁大神学过编程,于是就用 $ 1 $ 分钟的时间求出了 $ F_n $ 的结果。月落乌啼为此大吃一惊。你能学学爱与愁大神求出 $ F_n $ 的值吗?

输入格式

一行一个自然数 $ n $ 。

输出格式
只有 $ 1 $ 行一个实数 $ F_n $ ,保留两位小数。

解题思路

一 、通过题目标题可得知,这道题是求斐波那契数列,题目里也给了公式:

斐波那契数列公式

规律:

- f[1]=1
- f[2]=1
- f[3]=2
- f[4]=3
- f[5]=5
- f[6]=8
......
f[i]=f[i-1]+f[i-2]

注意保留两位小数(也可以输出.00,记得开 long long )

代码实现:


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
double f[100010]={0,1,1};
int main()
{
	int n;
	cin>>n;
	for(int i=3;i<=n;++i)
	{
	    f[i]=f[i-1]+f[i-2];//公式,求斐波那契
	} 
	printf("%.2lf\n",f[n]);
	return 0;
}

二 、打表

本题数据 $ 0 \leq n \leq 48 $ ,完全可以打表

妈妈再也不用担心我TLE了

打表代码


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
double f[101]={1.00,1.00,2.00,3.00,5.00,8.00,13.00,21.00,34.00,55.00,89.00,144.00,233.00,377.00,610.00,987.00,1597.00,2584.00,4181.00,6765.00,10946.00,17711.00,28657.00,46368.00,75025.00,121393.00,196418.00,317811.00,514229.00,832040.00,1346269.00,2178309.00,3524578.00,5702887.00,9227465.00,14930352.00,24157817.00,39088169.00,63245986.00,102334155.00,165580141.00,267914296.00,433494437.00,701408733.00,1134903170.00,1836311903.00,2971215073.00,4807526976.00};//打表
int main()
{
    int n;
    cin>>n;
    printf("%.2lf\n",f[n-1]);
    return 0;
}

三、套公式

科普一下 :
$ pow ( x ,y ) $ 返回x的y次方

套用公式
\(\dfrac{ ( \frac{ 1 + \sqrt{5} } {2} )^n - ( \frac{ 1 - \sqrt{5} } {2} )^n}{\sqrt{5}}\) 即可


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
int main()
{
	int n;
	cin>>n;
	printf("%.2f",(pow(((1+sqrt(5))/2),n)-pow(((1-sqrt(5))/2),n))/sqrt(5));//公式
	return 0;
}


四、记忆化搜索

记得要开long long!!!

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
long long f[10010];
long long dp(int x)
{
	if(x==0)   return 0;//特判
	if(f[x]>0) return f[x];
	if(x==1||x==2) return 1;
	return f[x]=dp(x-2)+dp(x-1);
}
int main()
{
	int n;
	cin>>n;
	cout<<dp(n)<<".00"<<endl;
	return 0;
}

END~~

posted @ 2022-02-02 15:01  exaqp  阅读(244)  评论(0编辑  收藏  举报