博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BJOI2012]最多的方案(记忆化搜索)
阅读量:5145 次
发布时间:2019-06-13

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

第二关和很出名的斐波那契数列有关,地球上的OIer都知道:F1=1, F2=2, Fi = Fi-1 + Fi-2,每一项都可以称为斐波那契数。现在给一个正整数N,它可以写成一些斐波那契数的和的形式。如果我们要求不同的方案中不能有相同的斐波那契数,那么对一个N最多可以写出多少种方案呢?

题意是说数列中不能出现相同的数。

显然要记忆化搜索。

直接搜会T,我们枚举下一个数填什么是要从大到小枚举,可以使效率有指数级的提升。

这是枚举上界,枚举下界可以用前缀和+二分来优化枚举复杂度。

加了这两个优化后代码跑的飞快。

Code

#include
#include
#include
#include
#define mm make_pairusing namespace std;typedef long long ll;ll dp[100],sum[100];map
,ll>mem;ll n;ll dfs(ll x,int xian){ if(!x)return 1; if(mem[mm(x,xian)])return mem[mm(x,xian)]; ll ans=0; int p=lower_bound(sum+1,sum+87+1,x)-sum; for(int i=p;i<=xian;++i)if(dp[i]<=x)ans+=dfs(x-dp[i],i-1);else break; return mem[mm(x,xian)]=ans;}int main(){ scanf("%lld",&n);dp[0]=dp[1]=1; for(int i=2;i<=87;++i)dp[i]=dp[i-1]+dp[i-2]; for(int i=1;i<=87;++i)sum[i]=sum[i-1]+dp[i]; printf("%lld",dfs(n,87)); return 0;}

 

转载于:https://www.cnblogs.com/ZH-comld/p/9693575.html

你可能感兴趣的文章
ExtJS 4.2 业务开发(一)主页搭建
查看>>
webpack Import 动态文件
查看>>
电脑没有安装iis,但是安装了.NET环境,如何调试网站发布的程序
查看>>
【Mac + GitHub】之在另一台Mac电脑上下载GitHub的SSH链接报错
查看>>
Day03:Selenium,BeautifulSoup4
查看>>
Java NIO系列教程(九) ServerSocketChannel
查看>>
awk变量
查看>>
mysql_对于DQL 的简单举例
查看>>
postgis几何操作函数集
查看>>
ACM题目————还是畅通工程
查看>>
CentOS7使用firewalld打开关闭防火墙与端口
查看>>
35. Search Insert Position(C++)
查看>>
ubuntu 卡在登陆界面无法进入桌面,但是可以进入命令行界面
查看>>
【转】vim中多标签和多窗口的使用
查看>>
[毕业生的商业软件开发之路]C#异常处理
查看>>
chrome 禁止自动更新
查看>>
一些php文件函数
查看>>
std::min error C2059: 语法错误:“::” 的解决方法
查看>>
Opencv保存摄像头视频&&各种编码器下视频文件占用空间对比
查看>>
「图形学」直线扫描——Bresenham算法改进了中点Bresenham算法?
查看>>