[BJOI2012]最多的方案(记忆化搜索)

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

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

显然要记忆化搜索。

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

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

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

Code

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#define mm make_pair
using namespace std;
typedef long long ll;
ll dp[100],sum[100];
map<pair<ll,int>,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

时间: 2024-11-09 03:36:54

[BJOI2012]最多的方案(记忆化搜索)的相关文章

BZOJ 1079: [SCOI2008]着色方案 记忆化搜索

1079: [SCOI2008]着色方案 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1079 Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得很难看,所以你希望统计任意两个相邻木块颜色不同的

bzoj1079 着色方案 记忆化搜索(dp)

题目传送门 题目大意: 有k种颜色,每个颜色ci可以涂个格子,要求相邻格子颜色不能一样,求方案数.ci<=5,k<=15. 思路: 题目里最重要的限制条件是相邻格子颜色不能相同,也就是当前格子只和上一个格子有关,那么对于还剩相同个数的颜色,如果都和上一个颜色不一样的话,那么这几种颜色都是一样的.如果某一种颜色和上一个颜色一样,那这个不算就可以了. 所以f[a][b][c][d][e][last]表示,还剩1次的颜色有a个,2两次颜色有b个,3次的颜色有c个,4次的颜色d个,5次的颜色e个,上一

路径方案数_mod_SPFA_记忆化搜索_C++

本文含有原创题,涉及版权利益问题,严禁转载,违者追究法律责任 本来是写个 DP 分分钟就 A 了,结果老师要我们写记忆化搜索(无奈脸) 算啦,随手一改又是一个标准的记忆化搜索(目测好像是记忆化搜索容易码一些,而且跑得快一些) 话说不取模也可以A,数据太水 很水的题吧,先 SPFA 跑一遍 2 的最短路,然后记忆化搜索统计方案 不难证明在加上最短路的限制条件后,图变成了一个 DAG 证明:首先有向是显然的,不可能存在两点 x,y,它们的最短路 d[x]>d[y] 又 d[x]<d[y] 若存在一

蓝桥杯 2014本科C++ B组 地宫取宝 DFS+记忆化搜索

历届试题 地宫取宝   时间限制:1.0s   内存限制:256.0MB 问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿). 当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明. 请你帮小明算一算,在给定的局面下,他有多少种不

csu 最优对称路径(bfs+记忆化搜索)

1106: 最优对称路径 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 371  Solved: 77[Submit][Status][Web Board] Description 给 一个n行n列的网格,每个格子里有一个1到9的数字.你需要从左上角走到右下角,其中每一步只能往上.下.左.右四个方向之一走到相邻格子,不能斜着走, 也不能走出网格,但可以重复经过一个格子.为了美观,你经过的路径还必须关于“左下-右上”这条对角线对称.下图是一个6x6网

记忆化搜索,FatMouse and Cheese

1.从gird[0][0]出发,每次的方向搜索一下,每次步数搜索一下 for(i=0; i<4; i++) { for(j=1; j<=k; j++) { int tx=x+d[i][0]*j; int ty=y+d[i][1]*j; if(tx>=0&&tx<n&&ty>=0&&ty<n&&grid[x][y]<grid[tx][ty]) { int temp=memSearch(tx,ty); i

LightOJ1417 Forwarding Emails(强连通分量+缩点+记忆化搜索)

题目大概是,每个人收到信息后会把信息发给他认识的一个人如此下去,问一开始要把信息发送给谁这样看到信息的人数最多. 首先找出图中的SCC并记录每个SCC里面的点数,如果传到一个SCC,那么里面的人都可以看到信息. 然后SCC缩点后就形成DAG,直接记忆化搜索,d(u)搜索从u点出发开始传最多能传多少人. 最后就是找答案了. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namesp

POJ 2704 Pascal&#39;s Travels (基础记忆化搜索)

Pascal's Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5328   Accepted: 2396 Description An n x n game board is populated with integers, one nonnegative integer per square. The goal is to travel along any legitimate path from t

HDU 1142 A Walk Through the Forest (Dijkstra + 记忆化搜索 好题)

A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6350    Accepted Submission(s): 2332 Problem Description Jimmy experiences a lot of stress at work these days, especial