[折半搜索][has] Jzoj P4250 路径
Description
Input
之后n行,每行n个整数,其中第i行第j列为Ai,j,满足Ai,i=0;Ai,j=Aj,i。
Output
Sample Input
3 60 1 31 0 2 3 2 0
Sample Output
2
Data Constraint
对于另外30%,1<=n<=14,1<=l<=30
对于100%,1<=n<=14,1<=Ai,j<=100,000,000,1<=l<=2,000,000,000
悄悄告诉你:数据的答案都很大,反正直接输0是没分的,但都在int范围内。
为了降低题目难度,Ai,j的种类数不会太多
题解
- 题目大意:有n个城市,问每个城市都走一遍,路径长度刚好为L的方案数
- 30%,暴力乱搜就好了,O(n!)
- 60%,n<=14,状压dp,设f[i][j][k]表示当前经过的点的状态为i,现在在点j,当前路径长为k,O(2^n*n^2*30),听说加个map可以跑70分
- 100%,n<=14,折半搜索可以过
- 记前半段除了1与i长度为n1,后半段为n2,那么如果确定了i,只要满足前半段与后半段经过的点不重复且路径总长为l就可以计算答案了
- 具体来说就是就是枚举一个点i,枚举前半段的所有情况,用hash记下来,再枚举后半段的所有情况
- 并在hash中找到与之对应的前半段,统计进答案中就好了
代码
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #define mo 19260817 5 #define ll long long 6 #define N 15 7 using namespace std; 8 int n,m,l,a[N][N],f[mo],ans,i; 9 ll g[mo]; 10 ll calc(int x,int y,int k){ return x*32768000000000ll+y*2000000000ll+k; } 11 int gethash(int x,int y,int k) 12 { 13 ll r=calc(x,y,k); 14 for (i=r%mo;g[i]&&g[i]!=r;++i==mo?i=0:i); 15 return i; 16 } 17 void dfs1(int d,int x,int y,int k) 18 { 19 if (x&&k>=l) return; 20 if (d>=m) 21 { 22 int p=gethash(x,y,k); 23 g[p]=calc(x,y,k),f[p]++; return; 24 } 25 for (int i=1;i<n;i++) if (!(y>>i&1)) dfs1(d+1,i,y|1<<i,k+a[x][i]); 26 } 27 void dfs2(int d,int x,int y,int k) 28 { 29 if (x&&k>=l) return; 30 if (d>=m) 31 { 32 int p=gethash(x,((~y)&((1<<n)-1))|1|1<<x,l-k); 33 ans+=f[p]; return; 34 } 35 for (int i=1;i<n;i++) if (!(y>>i&1)) dfs2(d+1,i,y|1<<i,k+a[x][i]); 36 } 37 int main() 38 { 39 scanf("%d%d",&n,&l); 40 for (int i=0;i<n;i++) for (int j=0;j<n;j++) scanf("%d",&a[i][j]); 41 m=n/2,dfs1(0,0,1,0),m=n-m,dfs2(0,0,1,0),printf("%d",ans); 42 }
转载于:https://www.cnblogs.com/Comfortable/p/10339544.html
[折半搜索][has] Jzoj P4250 路径相关推荐
- 【折半搜索-经典题目】中山纪念中学暑期游Day13——【GDOI2017模拟8.15】Buy
前言 考试时有道题目用到了[折半搜索] 老师推荐了这道经典题目让大家练习[前后部分算法不同]的题目 虽然不知道我有没有时间做,好歹先把题目记录一下,免得以后找不到了qwq 题目 Input Outpu ...
- 世界冰球锦标赛【折半搜索】
>Link luogu P4799 >Description 给出预算MMM和NNN场比赛的票价,试求:如果总票价不超过预算,有多少种观赛方案. 如果存在以其中一种方案观看某场比赛而另一种 ...
- 西山居3.22笔试第一题(折半搜索)
题意: 给出一个的表格,每个格子上都有一个数字.要求从左上角(1,1)出发,只能向下或向右走,走到右下角(m,n)视为结束.问有多少种走法能使得走过路径的总异或值等于. 输入: 第一行,三个数字,,, ...
- hexo 搜索_Hexo--本地搜索localsearch之url路径问题
Hexo localsearch 本地搜索 路径问题 / 什么是本地搜索 针对本地存储文件内容进行搜索,也就是我们搜索的内容都在本地 Hexo 本地搜索 localsearch 我们用的本地搜素插件是 ...
- Codeforces Round #297 (Div. 2)E. Anya and Cubes 折半搜索
Codeforces Round #297 (Div. 2)E. Anya and Cubes Time Limit: 2 Sec Memory Limit: 512 MB Submit: xxx ...
- [luogu4799 CEOI2015 Day2] 世界冰球锦标赛(折半搜索)
传送门 Solution 折半搜索裸题,注意\(long long\) Code #include <cmath> #include <cstdio> #include < ...
- Educational Codeforces Round 76 (Rated for Div. 2) F. Make Them Similar 折半搜索
传送门 文章目录 题意: 思路: 题意: 思路: 一个显然的思路就是2302^{30}230枚举所有的xxx,让后再检查,这个复杂度显然不能接受. 又发现对于每个位置它取多少不受其他位置限制,满足可拼 ...
- 【LOJ6072】苹果树【折半搜索】【矩阵树定理】【二项式反演】
题意:有好坏两种点共 nnn 个,每个好点有权值,把这 nnn 个点连成一棵树,一个好点为有用的当且仅当它至少与一个好点相邻,求所有有用的点的权值和不超过 limlimlim 的方案数. n≤40n\ ...
- 【无码专区4】幸运数字4(折半搜索+计数+结论)
因为只有std,没有自我实现,所以是无码专区 主要是为了训练思维能力 solution才是dls正解,但是因为只有潦草几句,所以大部分会有我自己基于正解上面的算法实现过程,可能选择的算法跟std中dl ...
最新文章
- 014_TimePicker时间选择器
- opencv 一种灰度图像增强方式
- 王者荣耀4月14日服务器维护,王者荣耀4月14日更新了什么内容?4月14日更新内容介绍...
- linux中demo当前目录,Linux pwd命令:显示当前路径
- uc 开发 缓存css,使用css3 flex布局在手机uc浏览器中一塌糊涂?
- 奇虎360开源其日志搜索引擎,可处理百万亿级的数据
- OpenCore引导配置说明第三版
- 人文社科开放数据库汇总
- 计算机产业现状及未来,2020工业计算机行业现状及未来前景分析
- [论文写作笔记] C9 概括和结论展示科学严谨性
- Jetson Nano 2G 使用HDMI连接电视机没有声音的问题
- 作为一个前端,你们的焦虑是什么?如何克服呢?
- PowerDesigner Excel导入信息
- “无法访问此网站”的一些原因
- 0x00B22E97 处有未经处理的异常(在 Project3.exe 中): 0xC00000FD: Stack overflow
- 腾讯员工绩效被打2星,情绪接近崩溃!大厂“内卷”太凶残......
- 高校图书馆管理系统 php 漏洞,某通用图书馆管理系统SQL注入_MySQL
- win10开机网络图标消失,可以联网重启资源管理器可以出来下次开机又不出现图标,是什么问题该怎么解决
- 欧盟剔除英国、瑞士和以色列开展量子计算遭声讨,科学无国界成伪命题
- 高效软件开发团队的特征