04 2021 档案
摘要:原题链接 考察:最短路+dp md最短路计数变个形我就不会了,我是fw 思路: 首先明确当前u点的次短路 = u的最短路+road[i].w 或 u的次短路 +road[i].w .这道题实际不需要先求一遍最短路,然后再求一遍次短路及其条数.像求树的直径一样,次短路和最短路可以一次性求完. 只需要像
阅读全文
摘要:原题链接 考察:双端队列+BFS+拆点 错误思路: 一开始想的是普通的BFS,但是用st数组记录有了哪些钥匙,但本蒟蒻脑子短路将st数组定义成全局变量.实际上是每一个点定义一个数存储该点有哪些钥匙.然后存储边想的是mp[x][y][i]表示x,y的i方向需要第几把钥匙.题解有类似写法,这种写法就是普
阅读全文
摘要:原题链接 考察:最短路 思路: 类似多源BFS,建立超级源点S,该源点到达所有起点的距离为0.求超级源点到达终点的最短距离. 这题可以扩展到多起点多终点问题,都是建立超级源点S求解 1 #include <iostream> 2 #include <cstring> 3 #include <vect
阅读全文
摘要:原题链接 考察:最短路+dp 写这道题的时候脑子很乱...没想多久就看了题解...忏悔 写题效率真的太低了... 引入: dp是基于拓扑序的图论最短(最小值)或最长(最大值)的问题.dp的每一个状态都能推导它后面的一个状态,这种有顺序的遍历就是拓扑序.但是对于不是拓扑序的dp问题应该如何求解? 思路
阅读全文
摘要:原题链接 考察:最短路+拓扑排序 完全不会,fw本f 错误思路: 一看题,这不spfa裸题吗,结果代码上去TLE. 正确思路: 有负权边求最短路,又卡SPFA.不考虑SPFA优化的话,似乎是没有办法了.但这道题特地说明了两种边的特性,所以可以从边入手. 已知双向边无负权边,如果不考虑单向边可以考虑用
阅读全文
摘要:原题链接 考察:最短路(双端队列)+二分 想到了二分,结果我是用dfs+二分,跑了6个数据TLE. 思路: 由题可知,题目是要求最大的第k+1条路径.我们除去k条路径后,就是求剩下的最大值最小.这很容易想到二分.关键是check函数怎么写.本蒟蒻的思路是dfs(当前点,二分值,k). 如果当前路径>
阅读全文
摘要:原题链接 考察:最短路+dfs 本题的正解思路想到了...但是感觉不可能放弃了....以后要戒掉感觉不可能的这个词 思路: 由于五个点都要到达.当我们从起点到达其中一个点后,剩下的就是求点与点之间的最短距离.这里直接预处理点与点之间的最短距离.再枚举到达点的顺序.不必担心到达某个点的途中去过了另一个
阅读全文
摘要:原题链接 考察:最短路+思维 洛谷普及题,本蒟蒻没想出来,我是fw. 思路: 在同一路线上的车站,只要是在当前点后面就可以不耗费到达.由此可以想到一个建图思路:在一条路上的,只要是在当前点后面的,就建立一条权值为w的有向边.很容易想到设w =0.但是这样不同路线就较难处理.由此设w = 1,答案是在
阅读全文
摘要:最短路算法整理 1.Dijkstra 算法 先讲讲朴素的Dijkstra算法的思路.朴素的Dijkstra算法先将起点入队.然后找到一个起点距离最近的点.再用这个点去更新其他所有的点.一共有多少个点就进行多少次迭代.因为每次找到一个用于更新距离的点.它的最短距离就已经确定了. 核心代码: #incl
阅读全文
摘要:原题链接 考察:搜索 思路: 参考lrj老师的总结.当问题可以用回溯解决但明显搜索树很深时,可以考虑用迭代加深优化. 分母最小能到1e7,很明显bfs一层就有MLE的风险.考虑dfs.很明显dfs的参数需要当前分子,当前分母,目前深度,枚举开始数.这里没必要等差为1递增枚举然后判断大小,直接
阅读全文
摘要:原题链接 考察:搜索 思路: 这道题题目描述略坑,这里简述下题意: 1.所有路线上的公交车形成等差数列,而且等差数列的最后一项再+d>60. 2.存在两个完全一样的路线. 3.求路线最少值. 由于题目提示信息:ans<=17.可以发现搜索树很深,但是答案在很浅的位置.所以可以用迭代加深搜索.此外这道
阅读全文
摘要:原题链接 考察:IDA*+离散化 这估价函数本蒟蒻完全没想到.... 思路: 最少操作次数,如果用bfs需要存储数组.考虑一波IDA*,无需存储数组只需要回溯.但是估价函数不好想.参考了大佬的题解,原来需要离散化....将不同的半径按大小映射为1~n之间的数字.目标就是让最终序列为1...n递增排序
阅读全文
摘要:原题链接 考察:bfs 思路: 存下所有草药的坐标,对于每一个草药求贝茜和骑士到达它的时间,每个时间遍历求最小值. 1 #include <iostream> 2 #include <cstring> 3 #include <queue> 4 using namespace std; 5 const
阅读全文
摘要:原题链接 折半搜索:一个我做一道相关题能T10次的算法 参考了大佬的题解,本蒟蒻没想出来怎么去重(搜索也没想到...绕在只放第x组的死循环里),但是大佬的题解也是T了第5点,开了O2才过... 思路: 首先明确重复的方法与所取砝码的质量无关,只与取的分别是谁有关.也就是说 测试数据 4 3 3 3
阅读全文
摘要:原题链接 考察:双向dfs 思路: 爆搜的时间复杂度是O(240).明显TLE.背包的时间复杂度是O(m*n) 也会TLE.所以需要优化. 这里的优化考虑折半搜索.也就只搜索一半.在搜索另一半的时候进行答案累加.这里先预处理在0~n/2的比赛里选的方案.然后在搜另一半的时候二分找到最大的与当前花费和
阅读全文
摘要:原题链接 考察:搜索 思路: 简单的bfs广搜即可.但是注意存在上一层是传送机下一层还是传送机的死循环点. 1 #include <iostream> 2 #include <cstring> 3 #include <queue> 4 using namespace std; 5 const int
阅读全文
摘要:原题链接 考察:bfs 思路: 考虑过IDA*,但是搜索层数不一定很浅.然后就是A*,想法是所有不在位置上的数的个数(空白部分不计).但是做之前为了搞懂题意看了讨论区,结果暴雷...看到题解大字标题bfs+hash.....我错了,以后还是自己搞懂题意555 普通的bfs就可以过.可以将数组定义为结
阅读全文
摘要:原题链接 考察:bfs 第一思路: 预处理鬼到达每个点的最短时间,再对男孩与女孩分别bfs...体感没错,不知道会不会MLE,但本蒟蒻连样例都没过.... 省事思路: 压根不用对鬼bfs.如果鬼能在k秒后达到某点,说明鬼的起点与终点的曼哈顿距离<=2*k.本蒟蒻完全没想到.... 接下来是对男女分别
阅读全文
摘要:原题链接 考察:IDA* 完全没想到啊....但通过这道题感觉dfs本质就是枚举吧...所以这道题dfs需要一直枚举AGCT,直到所有位置都匹配. 思路: 但是光枚举肯定会TLE的,所以需要剪枝.总共只有8个字符串,每个只有5个字符.最多(不可能达到)要40个字符.所以可以考虑迭代加深.我们在匹配时
阅读全文
摘要:原题链接 考察:搜索 思路: 预处理有子弹和城堡的坐标,这部分除了暴力没有更好的办法.因为还有一个时间限制,所以需要三维数组.剩下就是BFS. 剪枝: 1.相同时间的拜访点不必再访问. 2.当离终点的曼哈顿距离>能量 不必再走下去. 注意:城堡处一定要预处理再判断子弹. 1 #include <io
阅读全文
摘要:原题链接 考察:搜索 思路: bfs或dfs.dfs代码短一点.bfs可以用二进制标记去过的城市.不必用数组,同理dfs.听说本题数据水,可能本蒟蒻的代码有点问题. 1 #include <iostream> 2 #include <cstring> 3 #include <vector> 4 us
阅读全文
摘要:原题链接 考察:思维,前缀和 md 我是sb5555想了半天同余 思路: 当[l,r]区间和为0,说明sum[r]-sum[l-1]==0,也就是sum[r] == sum[l-1].对每个位置求前缀和.找出现次数最多的前缀和. 1 #include <iostream> 2 #include <c
阅读全文
摘要:原题链接 考察:思维 看半天没看出来,还以为和求最短交换次数差不多...实际完全不一样.菜狗不配... 思路: 如果我们再交换a1和a4就可以化为更小的环.每步交换都是两个权值之和.因此假设a1是环中最小的,就由贪心得交换的最小权值和是4*w1+w2+w3+w4+w5 但是如果这样贪心交上去依然WA
阅读全文
摘要:原题链接 考察:搜索 有大佬用的是单向搜索打表.不明觉厉...本蒟蒻是用的是双向bfs,参考了大佬的题解 原思路: 正反向搜索.按正向字典序顺序枚举操作,结果WA了n次....错误原因是正向字典序在正反重合时不一定保证完整的字符串是字典序最小的.如果是反向搜的时候重合的,就可能存在非最小的解. 正确
阅读全文
摘要:原题链接 考察:反向bfs+打表 思路: 可以以终态为起点求能到达的所有状态,并记录路径.这里可以不用unordered_map的记录状态,而是用康拓展开.(详细解释 GO) 注意康拓展开和反康拓展开是返回前面有几个全排列. 不多解释,这篇题解已经很详细了GO 1 #include <unorder
阅读全文
摘要:原题链接 考察:bfs 思路: vector存储所有是草的点,一次bfs枚举两个点作为起点.求遍历所有草的最少时间. 注意:存在只有一株草的情况 菜到只会做水题...蓝桥杯没得了5555 1 #include <iostream> 2 #include <cstring> 3 #include <v
阅读全文
摘要:原题链接 考察:IDA* 思路: 预估函数比较好想,可以发现每次移动都是让一个数字进一个数字出.所以预估函数 = 8-最大的相同数字出现次数. 字典序就操作按字典序枚举,那么第一个答案就是字典序最优的答案. 每次dfs枚举操作,如果一个个if else 写代码很冗长.所以可以人工打表,将A~H操作的
阅读全文
摘要:原题链接 打死本蒟蒻也想不到的估价函数 考察:IDA* 知道初态和终态,明显可以用双向搜索.时间复杂度是O(15*15*15)5/2 计算出来是>1e9,但实际底数没有15*15*15那么大.第一个是枚举长度,第二个枚举左端点,第三个枚举要放的位置.可能可以压线过.这里主要讲IDA*解法,代码跑的时
阅读全文
摘要:原题链接 考察:双向搜索dfs 思路: 很像背包模型,但是用背包TLE.这道题N<=46,不能用背包就可以考虑搜索,如果普通的爆搜时间复杂度是O(2n),也会TLE,需要优化.爆搜常考虑的优化有迭代加深,但是W太大不考虑.还有就是双向dfs,适用于终态和初态明确的情况下.这道题的终态需要一点思维,我
阅读全文
摘要:原题链接 考察:迭代加深搜索 思路: 迭代加深适用于预测的答案较小的情况,它比bfs更省空间.这里的加成序列在n<=10000的情况下,长度最长不超过14.因此可以用迭代加深. 光是迭代加深还是会T到爆,所以需要一些剪枝: 1.搜索顺序剪枝:每次优先处理结点少的分支,所以尽可能枚举大的点.所以我们从
阅读全文
摘要:原题链接 考察:搜索+背包dp 思路: 枚举n中选m个的组合数.最后在用dp求n-m个数能表示的和.时间复杂度Cnm * n*2000 ,数据跑不满.... 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 con
阅读全文
摘要:原题链接 考察:最短路 思路: dist[v]表示到v的最短距离,cnt[v]表示达到v最短距离条数.dijkstra算法里,一旦v出队,那么它的最短距离就已经确定了.因为到达点v的最短距离,一定比当前点再去扩展的距离小.所以这道题不需要担心重复遍历点v,使得此路径后面的点方法数全部+1 这里注意相
阅读全文
摘要:原题链接 考察:枚举+dfs or bfs 错误思路: 枚举每个点,求往下能到达的点和往上能到达的点,用st数组标记去过的点,set收集当前枚举点i能到达的点. 此思路错在如果存在双向边,有的点能去的点还未更新完就用来更新其他点.这使得这些点获得的点是不完全的,使得答案偏小. 正确思路: 枚举每个点
阅读全文
摘要:原题链接 考察:背包dp 思路: 组合问题一般用背包dp解决.f[i][j][k]表示前i个数选j个数,余数为k的最大和. 很容易想到状态转移方程f[i][j][k] = f[i-1][j-1][Get_Mod(k-a[i],K)]+a[i],f[i-1][j][k]之间取最值.时间复杂度是105*
阅读全文
摘要:原题链接 考察:并查集 思路: 很容易想到用并查集的根节点代表此集合的权值和.但是注意在结点合并的时候,会出现本不属于这里的权值.被路径压缩加到子结点上. 这里有两种处理方式: 一、建立虚点. 在x,y之上建立一个结点s,在路径压缩时就不会合并到y集合的权值k. 二、特殊处理x结点权值,在x权值和上
阅读全文
摘要:原题链接 考察:贪心+模拟 思路: 枚举从开始时间到结束时间每一天的收益.设收益为w,每天最多取min(树的苹果,v-w)个.注意不是最多取v个.因为是按天数枚举的.考虑存在苹果树没有取完隔天再取的情况,所以用了优先队列. 1 #include <iostream> 2 #include <cstr
阅读全文
摘要:原题链接 考察:模拟 思路: 总共就三种方式,每个检验一下就行.但是注意日期不为0,且注意存在相同的答案,经过排序会将相同的日期排在一起.所以直接判断前一个是否与当前相同即可. 1 #include <iostream> 2 #include <cstring> 3 #include <algori
阅读全文
摘要:原题链接 考察:堆+枚举+贪心 md完全没想到,我是fw 思路: 有贪心思想可知,我们可以确定离开当前鱼塘后,去其他鱼塘钓鱼比折返更优.所以我们可以枚举最远到达哪个鱼塘,这样走路的时间就确定了.剩下就是在枚举的鱼塘范围内取最大的T-走路时间的鱼数. 时间复杂度O(n*Tlog2T) 1 #inclu
阅读全文
摘要:原题链接 考察:思维 思路: 和CF817D一样的思路,考虑单点对答案的贡献.这题没必要统计左右边界.只需要记录上一个与当前字符相同的位置,右边界是字符串最右边.详情见代码 1 #include <iostream> 2 #include <cstring> 3 using namespace st
阅读全文
摘要:原题链接 考察:搜索 思路: 组合式枚举,然后check.可以用并查集检查是否为一条通路...很简单...但是我一开始想的是直接存储每个点到达的其他点然后字典序枚举路.这样会漏解比如c g f.... 最后答案是80...蓝桥杯提交不了.... 1 #include <iostream> 2 #in
阅读全文
摘要:原题链接 考察:记忆化搜索 思路: 注意f数组不能初始化为0,然后通过0判定是否搜过.因为不一定能到终点..... 1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 typedef long long LL; 5
阅读全文
摘要:原题链接 考察:记忆化搜索 思路: 注意这道题只需要覆盖最下面一行的点即可....对于每个第一行的点求出它能覆盖的最后一行的最左边和最右边.然后做区间覆盖即可.如果一个个点求会TLE.我们可以发现如果确定了一个点为起点,它能覆盖的左右端点都是确定的.所以可以用记忆化搜索. 但是这道题如何标记搜过的点
阅读全文
摘要:原题连接 考察:dfs搜索 思路: 注意这道题不能预处理每个圆覆盖的点及半径.假设我们先放a,a的半径为Ra,假设c点与a点距离>Ra但c的半径会受到a的覆盖范围的影响,也就是说Rc只能取dist-Ra.此时c的半径就和预处理的半径不同,不一定能覆盖预处理时判定能覆盖的点. 所以这道题只能全排列时计
阅读全文
摘要:原题链接 考察:枚举 错误思路: 爆搜,结果第九个点TLE.采取多个剪枝依旧第九点TLE.... 正确思路: 预处理合法的月+日+年.对于每一个字符串,检查是否有与他在有数字的位数上相同的合法日期,如果有就ans++ 坑点:质数不包括1与0,这两个一定要先赋值1!!!! 实测954ms 1 #inc
阅读全文
摘要:原题链接 考察:二分+二分图判定 or 带权并查集+贪心 思路一: 二分+二分图判定.由题目可知我们要求最大矛盾的最小值.最小值可以通过二分枚举,那么关键是如何check.首先容易想到>最小值的两个人一定不能在同一集合.需要将它们分别放在不同的监狱.那么问题来了:这样存放可能会导致某些破坏最小值合法
阅读全文
摘要:bfs搜索模型. 最常见的模型:flood fill. 一般用于计算连通块.需要标记哪些点走过,所以dfs求flood fill时不需要恢复现场. bfs通常应用:最短路 根据bfs的特性第一次走到该点就是最短距离. 多源bfs.多个起点,求到达其他点的最短距离.思想是建立超级源点.求超级源点到其他
阅读全文
摘要:bfs也用于求最短路的问题.但是一般bfs有个限制是边权必须相同.这样才能保证第一次到达此点,此点的距离就是最短距离(即入队的时候最短距离已经确定了) 证明: bfs队列里符合单调性和二段性. 一般用数学归纳法证明.当队列里只有一个点是正确的.假设队列里有n个点,队列与源点距离分布为 x x x..
阅读全文
摘要:原题链接 考察:双端队列bfs 思路: 双端队列常用于距离只有0,1的情况.当距离为0时,更新的点放在队头.当距离为1时,更新的点放在队尾. 判断01距离不用写冗长的if代码.可以参照方向数组预设距离为0的斜杠应该有的方向. 这里当出队的距离才是确定了此点的最短距离. 1 #include <ios
阅读全文
摘要:原题链接 考察:多源bfs 思路: 模板题.单纯记录证明过程.正解就是将所有值为1的点作为起点.bfs更新到达其他点的距离. 实际上相当于建立一个超级源点.该源点到其他为1的点距离是0.每次bfs取出队头的点一定是离源点距离最近的点.再以此更新到其他点的距离.这种做法很像dijkstra.但是区别是
阅读全文
摘要:原题链接 考察:二分+前缀和 思路: 易知w变大,y和变小,w变小,y和变大.由此发现y与w的变化关系有单调性.但是这道题求的是abs(Y-S),答案和w的变化并无单调性.我们可以求最小的>=s的Y和最大的<s的Y.再两边求最小值. 真的没必要死脑筋的返回true与false.单纯数值类型可考虑返回
阅读全文
摘要:原题链接 考察:线性dp+背包dp 思路: 每个横坐标可以选择按或者不按,这种组合问题求最优解可以考虑背包dp. 易知f[i][j]为以i为横坐标,j为纵坐标的最小按键次数.这道题不需要不通过后判两次dp.只需要在当前坐标存在管道后检测是否通过管道,如果不通过就是输出0 当前管道数-1.那么dp转移
阅读全文
摘要:原题链接 考察:线性dp 思路: 这道题就和POJ 1661差不多.f[i][0/1]表示到达第i条线段的0(左),1(右)的最小距离. f[i][0] = min(f[i-1][0]+i-1条线左端点到i条线左端点的最短距离,f[i-1][1]+i-1条线右端点到第i条线左端点的最小值) 同理右端
阅读全文
摘要:原题链接 考察:线性dp 此题不会,fw本f 思路: 求方案数且需要取模,基本上使用dp求解. 根据题目,dp状态一定要记录a取到哪一位,b匹配到哪一位,同时还有段数限制,所以还需要记录段数.所以设置f[i][j][k]为以a的前i位匹配了b前j位,已经用了k段. 此时还发现对于第i位,我们需要判断
阅读全文
摘要:原题链接 考察:线性dp 思路: 一开始的思路是定义结构体dp数组,但是会出现到达同一点剩余卡片种类不同的情况,只要卡片种类不同就会获得不同的分数,所以必须记录剩余卡片种类. 考虑到M很小,cnt(每种卡片)<=40.可以考虑开数组f[i][j][k][p][q] 表示到i点时剩余卡片为j,k,p,
阅读全文
摘要:原题链接 考察:线性dp+贪心 本蒟蒻真真菜到抠脚...二维MLE,滚动后TLE,绝望...已经菜到不会写普及组的题. 错误思路: 设f[i][j]为i秒时魔力为j的最大距离,总共三种决策: 一、 休息, f[i][j] = f[i-1][j] 二、 魔法,f[i]j] = f[i-1][j+10]
阅读全文
摘要:原题链接 考察:树形dp 思路: 树上最大值,最小值,方案数是树形dp常考的问题.这里设置f[i][j]为在以i为根的子树中,i的颜色是j的最大结点数. 设置2为绿色,初始化所有f[i][2] = 1.如果当前父节点u只有一个子结点x f[u][k] += max(f[x][j]) j!=k. 如果
阅读全文
摘要:原题链接 考察:树形dp 思路: 换根dp,f[i][j][0]表示以i为根的子树中与i距离不超过j的权值和.f[i][j][1]表示以i为起点,往上走距离不超过j的点集合. 易知f[i][j][0] += f[v][j-1][0] 其中f[i][0][0] = w[i] 如果是往上走:f[v][j
阅读全文
摘要:原题链接 考察:树形dp 错误思路: 换根dp,正向点权值0,逆向点权值1.求每个点到其他点的距离和. 此思路错在会多次计算要旋转的边. 思路: 换根dp,需要两次dfs求当前结点i往下走的逆转数和往上走的逆转数.向下走的计算很容易 f[u][1]+=f[v][1]+road[i].w 向上走如果直
阅读全文
摘要:1. 树的重心:重心是指树中的一个结点,如果将这个点删除后,剩余各个连通块中点数的最大值最小,那么这个节点被称为树的重心。 性质: 树中所有点到重心的距离和是最小的,一棵树最多有两个重心(比如就两个点连个边). 把两棵树通过加一条边得到一颗新的树,新的树的重心必然在连接原来两棵树重心的路径上. 一棵
阅读全文
摘要:原题链接 考察:树形dp 想了半天没想出来怎么从父节点的深度和推到子节点深度和,我果然fw 思路: 换根dp模板题.也称二次扫描法,第一次多用于预处理,第二次多用于计算答案. 第一次dfs时,用子节点更新父节点,计算每个结点的子树结点个数,并计算当前假定根的深度和 第二次dfs时,用父节点更新子节点
阅读全文
摘要:原题链接 考察:树形dp 推dp转移方程的时候,总是忘记f数组原来定义的含义...初始化也可以帮助推出dp数组. 思路: f[u][j] 表示以u为根的子树中,保留j个点最少的剪枝数.初始化f[u][1] = son[u].这样初始化一开始点都是独立的,通过下面的转移方程将它们连起来. 那么dp转移
阅读全文
摘要:原题链接 考察:树形dp 思路: 参考大佬的思路,本蒟蒻还以为是有依赖的背包问题,但是直接开背包数组会MLE. 定义f[i]为以i为根节点的子树中,最大的结点和.f[i] = max(f[i],f[j](j为i的所有直接或间接的子节点)). 这道题是选两个不相干的最大子树和,需要在每个结点处取最值.
阅读全文
摘要:原题链接 考察:思维+构造 打死本蒟蒻也想不到系列 思路: 当(n+1)n = n 此情况不存在 即 n = -1 (n+1)n = n+1 此情况不存在 n = 1 1 #include <iostream> 2 #include <cstring> 3 #include <vector> 4 #
阅读全文
摘要:原题链接 考察:推导(?) 思路: k所表示的数一定可以在某一层的2n-1的位置上.对于当前n,如果k>2n-1,那么将它调到左边k-=2n-1,如果<说明k所代表数在下一层,=即可跳出. 1 #include <iostream> 2 #include <cstring> 3 using name
阅读全文
摘要:原题链接 考察:模拟,贪心 思路: 大水题,但我WA两次.... 第一次没考虑b<a的情况,求距离是abs 第二次没考虑多次中转的情况...一开始的思路就是只存在一个中转站,如果>1个不如直接飞去后面那个.但实际此思路错误: eg: 111110000 (第1个是源地址,最后一个是目标),实际上一个
阅读全文
摘要:原题链接 考察:区间DP 思路: f[i][j]表示[i,j]区间的最大得分,那么状态转移方程f[l][r] = max(f[l][r],calc(f[l][k],f[k+1][r],op[k+1]) calc函数是什么呢,根据定义f[i][j]表示i,j区间合并后的最大得分,calc就是再将f[l
阅读全文
摘要:原题链接 考察:区间DP 处理方式略像涂色...本蒟蒻是没想出来怎么转移.... 思路: 实际就是暴力...本蒟蒻还想了怎么快速判断循环..... 对于枚举的区间[l,r],看是否是循环区间,如果不是要再看里面的子区间是否为循环区间,枚举子区间f[l][r] = min(f[l][k]+f[k+1]
阅读全文
摘要:原题链接 考察:区间dp 这题就是一维的棋盘分割. 思路: f[i][j][k]表示将[i,j]区间分为k份得到的最大值.与棋盘分割不同的是,这道题是一维的,所以我们可以只枚举选上半边就可以枚举到所有方案.也可以枚举选下半边,但是注意这道题要预留足够的空间给进一步选择的上半边和下半边,因为memse
阅读全文
摘要:原题链接 考察:区间dp 这题好像HDU 4283 可以往左或者往右走.但是这道题起始位置不确定,也就是说,i位置不一定是栈底. 非常详细的题解 思路: 因为题目完全不一样,所以必须换一个思路.以f[i][j]表示灭掉[i,j]所有灯消耗的功率.首先明确老张灭灯只要路过了就会灭,因此最后的位置要么是
阅读全文
摘要:原题链接 考察:区间dp 思路: 这道题和凸边形的划分很像,枚举中间点,两边成为独立的两部分.只不过这题可以横,纵着切,所以是两个方向的区间dp.对于一块矩形板,我们选了上面,下面与平均值的标准差就确定了,快速求解矩阵和可用二维前缀和预处理.因为要用到二维,所以是五维转移方程f[x][y][a][b
阅读全文
摘要:原题链接 考察:状压dp+dfs寻找路径 思路: 重复覆盖问题.参考愤怒的小鸟的思路,我们需要两两构造一个包含两个字符串a,b的DNA序列,然后要分a在前面与b在前面两种情况. 本蒟蒻一开始想的是定义结构体String,再定义结构体内部的st(二进制标记哪些串被标记),构造后的具体字符串s.每个状态
阅读全文
摘要:原题链接 考察:状压dp 这也能状压?果然是我太弱了. 思路: 很容易想到压缩相同的数字,采取最暴力的做法就是将m个数字全排列计算代价的最小值.时间复杂度是O(m!)会T爆,所以需要优化. 假设有队列3个,我们队列顺序为1 2和队列顺序2 1,最后放3.可以发现如果确定了1 2和2 1的最小值后,放
阅读全文
摘要:原题链接 考察:区间dp 思路: 根据题目我们可以发现,当相邻两颗珠子合并时,只剩下首尾,中间部分不关心. 我们回顾一下区间dp,f[l][r]表示将[l,r]区间内的石子合并(以模板题为例),中间是什么我们也不关心,而f数组求最值是以某个分割点k来划分集合. f[l][r] = max(f[l][
阅读全文
摘要:原题链接 考察:状压dp 重复覆盖模型,最优解是用dancing links.这里dp可以比暴力dfs稍微优化. 本蒟蒻的思路: 枚举两个点(横坐标不能相同)构造一条抛物线.再对每一条抛物线看是否还有点能被该抛物线覆盖.最后dp求到达(1<<n)-1的最短距离. 除法一定要注意判0 1 #inclu
阅读全文
摘要:原题链接 考察:贪心 思路: 由贪心可得,最长上升子序列要求前面尽可能的小,最短上升子序列要求前面尽可能的大.如果没有<>的限制,那么最长上升子序列是1 2 3 4...n,最短上升子序列是n n-1...1.对于最长上升子序列,每有一个>说明前后需要互换位置,对于最短上升子序列,每有一个<说明前后
阅读全文
摘要:原题链接 考察:有限状态机dp+kmp 鬼才想得到的解法 思路: 在验证某串a是否为b的子串时,常常使用kmp算法.当子串匹配下标j = 子串长度时,说明串a是串b的子串.如果i取到串b的最后一位时,j还没有 = a长度,说明a不是b的子串. 在这道题,我们需要构造串b,使得a不是b的子串,也就是j
阅读全文
摘要:原题链接 考察:线性dp 思路: 很容易想到f[i][j]表示前i趟运了j头牛的最小时间(本蒟蒻虽然想到了但因为会T放弃了这个想法,所以会T的做法先想想看能不能优化啊啊啊) 所以f[i][j] = f[i-1][k]+sum[j-k]+2*m(这里会在最后一次多算一次m,最后答案减去即可).最后答案
阅读全文
摘要:原题链接 考察:树形背包dp 思路: 首先我们需要拿一个变量作为背包的体积,不能以钱数做体积,因为范围没有给定.所以只能以人数做体积.f[i][j]表示以i为根节点的子树中,选j个人的最大花费.如果>=0表示方案可行.因为人数是可以枚举的,所以不会漏解. 这里要注意的是背包体积不能直接设为m,否则会
阅读全文
摘要:原题链接 考察:背包dp 思路: 做之前看成01背包,然后答案一直不对,醉了. 实际是完全背包,因为需要的东西不超过5类,且不超过5个,所以可以用5维数组.5类物品的数目都是体积. 需要将编号离散化,这里用的是map映射. 但是注意的是我的本地IDE 在mp[x] = mp.size()是从1开始,
阅读全文
摘要:原题链接 考察:多重背包dp 思路: 多重背包板子,然后注意压掉一重循环需要倒序体积.... 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 typedef long lo
阅读全文