摘要: 题面 还可以这么搜......学到了(PoPoQQQ orz) 我们最朴素的做法是枚举所有状态(当然可以剪,剪完最终实际状态量也是$C_{26}^{13}$的),然后每次$O(n)$扫一遍判断,大概会T炸,考虑优化 我们先预处理每个状态中$1$的数目和连边的状态,然后压缩状态初始让一边集合为空,一边 阅读全文
posted @ 2018-10-12 23:08 Speranza_Leaf 阅读(120) 评论(0) 推荐(0)
摘要: 题面 考虑一个点$x$,如果某两个点$u,v$间的所有最短路都经过$x$,那么$x$肯定是重要的。这个题$n$比较小,所以我们直接跑floyd,在过程中记录 当发生松弛时,我们具体讨论: 如果这个长度是两点间新更新出的一条最短路,即$dis[i][j]>dis[i][k]+dis[k][j]$,我们 阅读全文
posted @ 2018-10-12 22:58 Speranza_Leaf 阅读(118) 评论(0) 推荐(0)
摘要: 题面 在朴素中透着一点新意的状压DP 一个很暴力的思路是枚举位置,状态和硬币,每次二分出向前最多能买到哪里,复杂度爆炸($O(2^knklog$ $n)$) 考虑优化,不妨先预处理一下$goal[i][j]$表示每个硬币$i$在每个位置$j$最多向前能买到哪里,但是这样还是很爆炸,所以我们找来了一个 阅读全文
posted @ 2018-10-12 22:48 Speranza_Leaf 阅读(151) 评论(0) 推荐(0)
摘要: 题面 这个题剪枝比较多的说=。= 1.记录最长和最短的木棍,限制枚举的上下界 2.记录木棍的总长$tot$,只在其能被枚举的长度整除时搜索 3.从长到短枚举长度(暂时好像没啥用) 4.每次(不是新的一根木棍时)从上次枚举的长度开始枚举(和3组合起来用的) 5.(强剪枝来了)如果是在尝试拼一根新木棍, 阅读全文
posted @ 2018-10-12 18:57 Speranza_Leaf 阅读(181) 评论(0) 推荐(0)
摘要: 题面 如果没有两个数不能相同这个限制就两个数组排序后贪心即可。现在加上这个限制,注意到每个数组中的数是两两不同的,所以每次一定能在前面或后面一个数中找一个换过来,这样每次考虑相邻三个数转移就可以了,注意特判一下边界。 1 #include<cmath> 2 #include<cstdio> 3 #i 阅读全文
posted @ 2018-10-12 18:56 Speranza_Leaf 阅读(110) 评论(0) 推荐(0)
摘要: 题面 好像没啥可说的,就当练码力了...... 先用BFS跑出岛屿,然后跑最短路求岛屿间的距离,最后状压DP得出答案 注意细节,码码码2333 1 #include<set> 2 #include<queue> 3 #include<cstdio> 4 #include<cstring> 5 #in 阅读全文
posted @ 2018-10-12 18:48 Speranza_Leaf 阅读(149) 评论(0) 推荐(0)
摘要: 题面 我把这个当做IDA*的模板题的说,说说我个人对IDA*的理解 IDA*是一个DFS,和A*一样,它也有一个乐观的估价函数。这里这个估价函数是用来限制状态的扩展的,如果当前代价加上乐观的估计都无法在规定层数内出解,我们就不向更深搜索了。这里取位置有差异的骑士个数作为估价函数即可,注意是骑士个数, 阅读全文
posted @ 2018-10-12 17:49 Speranza_Leaf 阅读(106) 评论(0) 推荐(0)
摘要: 题面 题外话:神**可持久化左偏树,你谷的人都太神了,学不来 我把这个当做A*模板题的说,先讲一讲个人对A*的理解:如果说普通的BFS是Bellman_Ford,那A*就是一个Dijkstra。以寻找第$k$优解为例,本来我们是要搜$k$遍;现在我们给当前的实际代价加上一个估计的乐观代价,这个就叫做 阅读全文
posted @ 2018-10-12 17:42 Speranza_Leaf 阅读(141) 评论(0) 推荐(0)
摘要: 题面 裸的搜索题,就说剪枝(注:nw->noww->当前,res->rest->剩余): 1.想达到$Nπ$的体积,那么半径一开始最多也就$sqrt(n)$了,再大就超了。。。 2.可以预处理$minv[i]$表示还剩$i$层时最少还要放多少的体积,当当前体积$+minv[res]>n$时剪掉 3. 阅读全文
posted @ 2018-10-12 17:22 Speranza_Leaf 阅读(137) 评论(0) 推荐(0)