题意

题目链接

求出把$n$分解为斐波那契数的方案数,方案两两不同的定义是分解出来的数不完全相同

Sol

这种题,直接爆搜啊。。。

打表后不难发现$<=1e18$的fib数只有88个

最先想到的应该是直接把$n$加入到搜索状态里,然后枚举能被分成哪些

但是这样分解出来的数可能会有重复的,因此我们还要把当前考虑到第几个数也加入到状态里。

不难得到以下代码

但是很显然会T飞。

优化一下,只考虑当前的fib数对答案的贡献,

也就是搜两种情况:

1、用该数分解

2、不用该数分解

代码是这样的

然而还是会T飞。

继续剪枝。

根据斐波那契的性质$\sum_{i = 1}^n f_i = f_{n+2} -1$

因此我们想要用前$ti - 1$个合成$x$,必须满足$x < f_{ti+1}$。

然后就A了qwq

// luogu-judger-enable-o2
#include<cstdio>
#include<iostream>
#include<map>
#define Pair pair<int, int>
#define MP(x, y) make_pair(x, y)
#define fi first
#define se second
#define int long long
#define ull unsigned long long
using namespace std;
const int MAXN = 1e5 + ;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
int f[MAXN], tot, lim, dp[MAXN], N;
map<Pair, int> mp;
int dfs(int x, int ti) {
if(mp.find(MP(x, ti)) != mp.end()) return mp[MP(x, ti)];
if(x == ) return ;
int ans = ;
/*for(int i = ti; i >= 1; i--) {
if(x - f[i] >= 0) ans += dfs(x - f[i], i - 1);
//else break;
}*/
if(x - f[ti] >= ) ans += dfs(x - f[ti], ti - );
if(x < f[ti + ])
ans += dfs(x, ti - ); return mp[MP(x, ti)] = ans;
}
main() {
lim = 1e18;
f[] = ; f[] = ;
for(int i = ; i; i++) {
f[i] = f[i - ] + f[i - ];
if(f[i] > lim) {tot = i; break;}
}
N = read();
//dp[0] = 1;
cout << dfs(N, tot - );
return ;
}

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

  1. 【题解】洛谷P3953 [NOIP2017TG] 逛公园(记忆化搜索+SPFA)

    题目来源:洛谷P3953 思路 先用SPFA求一遍最短路 在求最短路的同时可以把所有点到终点的最短路求出来 dis数组 注意要反向SPFA  因为从起点开始可能会走到一些奇怪的路上导致时间负责度增加 ...

  2. 洛谷1514 引水入域 dp+记忆化搜索

    题目链接:https://www.luogu.com.cn/problem/P1514 题意大致是:给定一个(n,m)的数值矩阵,可以在第一行建造水库,如果一个格子周围的某格子值小于它,那水就可以流到 ...

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

    1079: [SCOI2008]着色方案 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  4. SCOI2008着色方案(记忆化搜索)

    有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i 种颜色的油漆足够涂ci 个木块.所有油漆刚好足够涂满所有木块,即 c1+c2+...+ck=n.相邻两个木块涂相同色显得很难 ...

  5. BZOJ1079: [SCOI2008]着色方案 (记忆化搜索)

    题意:有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得很 ...

  6. 洛谷 P3953 逛公园【spfa+记忆化dfs+bfs】

    spfa预处理出最短路数组dis,然后反向建边bfs出ok[u]表示u能到n点 然后发现有0环的话时候有inf解的,先dfs找0环判断即可 然后dfs,设状态f[u][v]为到u点,还可以跑最短路+v ...

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

    题目传送门 题目大意: 有k种颜色,每个颜色ci可以涂个格子,要求相邻格子颜色不能一样,求方案数.ci<=5,k<=15. 思路: 题目里最重要的限制条件是相邻格子颜色不能相同,也就是当前 ...

  8. 【P2476】着色方案(记忆化搜索+特殊的DP数组)

    这个题代码难度几乎为0,然而思维难度对于蒟蒻来说简直是突破天际啊!首先我思考的是这个油漆的种类只有15种,是不是可以像一道叫做8数码难题的东西暴力15维数组呢..计算发现不可以....空间会直接让你学 ...

  9. 洛谷 [BJOI2012]最多的方案

    洛谷 这题是旁边同学介绍的,听他说记忆化搜索可以过... 不过我还是老老实实的想\(dp\)吧- 先看看数据范围,\(n\leq10^{18}\)相当于\(n \leq fib[86]\). 以前打\ ...

随机推荐

  1. shell批量创建文件及改名

    批量创建文件及改名企业面试题2:使用for循环在/usr/sunzy目录下通过随机小写10个字母,批量创建10个html文件. #!/bin/bash Path=/usr/sunzy [ -d $Pa ...

  2. HTTP ERROR

    HTTP 400 – 请求无效HTTP 401.1 – 未授权:登录失败HTTP 401.2 – 未授权:服务器配置问题导致登录失败HTTP 401.3 – ACL 禁止访问资源HTTP 401.4 ...

  3. mongodb 操作数据库

    1.使用和创建数据库: use mydb //没有就创建 2.显示数据库 show dbs 3.显示数据库状态 db.stats() 4.检查当前所用的数据库 db 5.删除数据库(先用然后删除) u ...

  4. nodejs assert 模块

    assert模块是Node的内置模块,主要用于断定.如果表达式不符合预期,就抛出一个错误.该模块提供11个方法,但只有少数几个是常用的. 1.assert() assert(value[, messa ...

  5. pip 在windows下如何升级

    建议:由于是pip的国外的,在更新之前先开启vpn,这样更新会顺畅些. 官方网页要求在 cmd中输入以下命令进行 pip的 更新: python -m pip install -U pip 更新成功后 ...

  6. shell script-判断式

    test判断式 看下面: test -e /opt/a.txt && echo "exist" || echo "not exist" 判断 / ...

  7. R语言简单作图

    以下函数只为满足常用的若干作图需求. 基本作图: plot(x).plot(x, y) #散点图,最多两个变量     #可使用参数type生成不同的效果图.常用'l'.'o'.'h',分别为折线图, ...

  8. sklearn保存模型

    # View more python tutorials on my Youtube and Youku channel!!! # Youtube video tutorial: https://ww ...

  9. 20. CTF综合靶机渗透(十三)

    靶机说明: Wellcome to "PwnLab: init", my first Boot2Root virtual machine. Meant to be easy, I ...

  10. SpringBoot应用篇(一):自定义starter

    一.码前必备知识 1.SpringBoot starter机制 SpringBoot中的starter是一种非常重要的机制,能够抛弃以前繁杂的配置,将其统一集成进starter,应用者只需要在mave ...