洛谷P4133 [BJOI2012]最多的方案(记忆化搜索)
题意
求出把$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]最多的方案(记忆化搜索)的更多相关文章
- 【题解】洛谷P3953 [NOIP2017TG] 逛公园(记忆化搜索+SPFA)
题目来源:洛谷P3953 思路 先用SPFA求一遍最短路 在求最短路的同时可以把所有点到终点的最短路求出来 dis数组 注意要反向SPFA 因为从起点开始可能会走到一些奇怪的路上导致时间负责度增加 ...
- 洛谷1514 引水入域 dp+记忆化搜索
题目链接:https://www.luogu.com.cn/problem/P1514 题意大致是:给定一个(n,m)的数值矩阵,可以在第一行建造水库,如果一个格子周围的某格子值小于它,那水就可以流到 ...
- BZOJ 1079: [SCOI2008]着色方案 记忆化搜索
1079: [SCOI2008]着色方案 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...
- SCOI2008着色方案(记忆化搜索)
有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i 种颜色的油漆足够涂ci 个木块.所有油漆刚好足够涂满所有木块,即 c1+c2+...+ck=n.相邻两个木块涂相同色显得很难 ...
- BZOJ1079: [SCOI2008]着色方案 (记忆化搜索)
题意:有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块. 所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得很 ...
- 洛谷 P3953 逛公园【spfa+记忆化dfs+bfs】
spfa预处理出最短路数组dis,然后反向建边bfs出ok[u]表示u能到n点 然后发现有0环的话时候有inf解的,先dfs找0环判断即可 然后dfs,设状态f[u][v]为到u点,还可以跑最短路+v ...
- bzoj1079 着色方案 记忆化搜索(dp)
题目传送门 题目大意: 有k种颜色,每个颜色ci可以涂个格子,要求相邻格子颜色不能一样,求方案数.ci<=5,k<=15. 思路: 题目里最重要的限制条件是相邻格子颜色不能相同,也就是当前 ...
- 【P2476】着色方案(记忆化搜索+特殊的DP数组)
这个题代码难度几乎为0,然而思维难度对于蒟蒻来说简直是突破天际啊!首先我思考的是这个油漆的种类只有15种,是不是可以像一道叫做8数码难题的东西暴力15维数组呢..计算发现不可以....空间会直接让你学 ...
- 洛谷 [BJOI2012]最多的方案
洛谷 这题是旁边同学介绍的,听他说记忆化搜索可以过... 不过我还是老老实实的想\(dp\)吧- 先看看数据范围,\(n\leq10^{18}\)相当于\(n \leq fib[86]\). 以前打\ ...
随机推荐
- top查看CPU情况
Linux查看CPU情况 在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况.运行 top ...
- ViewPageIndicator--仿网易的使用
仿微信(网易的界面) 第一步: AndroidManifest.xml 的配置 <?xml version="1.0" encoding="utf-8"? ...
- 19E Fairy
Once upon a time there lived a good fairy A. One day a fine young man B came to her and asked to pre ...
- neon eclipse tomcat发布项目乱码
解决方法如图
- Entity Framework Code-First(9):DataAnnotations
DataAnnotations in Code-First: EF Code-First provides a set of DataAnnotation attributes, which you ...
- java多线程有几种实现方法,都是什么?
转自:http://www.cnblogs.com/liujichang/p/3150387.html 多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方法有两种, ...
- jquery ajax 与 update panel
回调函数
- 多值cookie
- sqlachemy知识点
mysql语句 1.GROUP BY基本语法格式: GROUP BY关键字可以将查询结果按照某个字段或多个字段进行分组.字段中值相等的为一组.基本的语法格式如下: GROUP BY 属性名 [HAVI ...
- [CentOS7] minimal安装后 出现 没有ifconfig 无法ping 无法yum could not retrieve mirrorlist http://mirrorlist.centos.org/
刚以minimal方式安装完CentOS,打算看下ip,结果ifconfig没找到(后来得知可以用ip addr查看本机ip) 于是yum grouplist, 结果出现could not retri ...