第一部分 基础算法
第 1 章 贪心算法
1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了。
2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按照右端点排序,每次贪心的从区间的最右边种,然后检查下一个区间是否缺少,缺的话就在最右边继续补。
3):「一本通 1.1 例 3」喷水装置:这题可以发现每个装置所能覆盖的区间是一个矩形,所以这题就变成了给了一堆线段,选出最少线段覆盖整个区间,按照右端点排序然后贪心就可以了。
4):「一本通 1.1 例 4」加工生产调度:明显发现A工厂是不需要任何空闲时间的,所以就是让B的空闲时间尽量少。然后开两个数组存一下A比B长的和B比A长的,升序降序排序之后,每次取两边较大值为用时。
5):「一本通 1.1 例 5」智力大冲浪:这题明显按照亏损的大小排序之后能取就取一定就是最优的。。。所以按照亏损排序之后暴力贪就可以了。
6):「一本通 1.1 练习 1」数列极差:可以发现,我们从最小的开始算,每次都取最小的两个可以得到最大值,而反过来之后每次都取最大的可以得到最小值。最小值容易得到,最大值使用堆进行优化就可以了。当然平衡树也可以支持这个操作。
7):「一本通 1.1 练习 2」数列分段:二分答案,然后贪心判断就可以了。
8):「一本通 1.1 练习 3」线段:线段覆盖的另一种题型,依然是按照右端点排序,然后暴力扫一遍就可以得出解了。
9):「一本通 1.1 练习 4」家庭作业:这题应该叫加强版智力大冲浪。。。将暴力维护变成并查集维护,判断一个任务是否能使用,可以使用则f[t[i]]=find(f[t[i]-1])。
10):「一本通 1.1 练习 5」钓鱼:可以发现我们不会走回头路。。。然后就可以枚举走到那一个湖,然后直接对接下来时间里可能能钓到的的鱼取最大值加起来就可以了。
11):「一本通 1.1 练习 6」糖果传递:环形均分纸牌。。。这题不该在这个地方啊。
第 2 章 二分与三分
1):「一本通 1.2 例 1」愤怒的牛:二分最终答案,然后对每个x进行check,本着能放就放,不能放就攒着的原则,看牛棚够不够放下所有的牛。
2):「一本通 1.2 例 2」Best Cow Fences:首先二分平均数,那么这个题就变成了问是否有一个平均数大于x的子段。可以先把所有数都减去x,这样就变成了是否有一个和大于0的长度大于L的子段,考虑找出一个和最大的长度大于L的子段,可以单调队列解决。
3):「一本通 1.2 例 3」曲线:由于开口向上的二次函数具有下凸性,所以把多个这样的函数求max他依然具有下凸性,所以直接三分就可以了。
4):「一本通 1.2 练习 1」数列分段 II:二分一下这个值,然后一旦大于这个数就分开。
5):「一本通 1.2 练习 2」扩散:这个题叫最小生成树,计算距离直接打上就可以了。。。
6):「一本通 1.2 练习 3」灯泡:利用初中数学知识对这些值列出式子并化简之后,可以发现最终答案的式子是一个上凸函数。。。三分求解就可以了。
7):「一本通 1.2 练习 4」传送带:明显走传送带所能减少的距离一定是一个凸函数,先三分在第一个传送带上走的距离,再二分在第二个传送带上走的距离。
第 3 章 深搜的剪枝技巧
1):「一本通 1.3 例 1」数的划分:大力搜索即可,加上一个可行性剪枝直接跑就行。
2):「一本通 1.3 例 2」生日蛋糕:其实说这么多这题就一句话的是,就那个开根号的的式子要推出来。。。或者推出那个高和半径的合法的关系式子,来个可行性剪枝,就没问题了。
3):「一本通 1.3 例 3」小木棍:首先把大于50的全都给他扔了,然后从大到小搜原来有多少根,那么不能整除的就可以直接剪了,然后搜的时候加上一个可行性剪枝。还有就是先从大到小排一下序会快上一些。仍然有一个剪枝就是如果已经选的加上你正要选的不比你已经找到的答案小,那么直接换一根搜。
4):「一本通 1.3 例 4」Addition Chains:n<=100,可以考虑bfs,因为有一个比较确定的起点和一个确定的终点,大力记录每个数是由那个数拓展过来的,然后输出路径一边bfs一边输出就可以了。
5):「一本通 1.3 例 5」weight:首先把这些个数排序,然后一个个枚举是放到前面还是放到后面,暴力搜索就可以了。然后由于我们确定了一半的数据就可以算出整个数列,所以可以剪去后面的。
6):「一本通 1.3 练习 1」埃及分数:这个迭代加深搜索的模板题,设置一个估价函数,到了某一层还没出解的直接返回就可以了。
7):「一本通 1.3 练习 2」平板涂色:可以先看范围,N<=16......坐标小于100....那么大力搜索就可以了。。可以发现能涂的点之间满足拓扑关系,可以先直接暴力建图,然后大力dfs。
8):「一本通 1.3 练习 3」质数方阵:这个题有各种各样神奇的搜索方法可以搜过去。总体来说一共大概有这么几种:①一行一列一行一列搜;②记录前缀然后搜索;③某个叫跳舞链的神奇算法。注意在搜之前先找出不可以的数剪掉。
9):「NOIP2009」靶形数独:这个题可以完全不管那个靶子条件直接数独,就是枚举一个格子,然后枚举数,能填就填,不能填就return,最大值更大了就更新。。。由于数独的状态会随着你填数而不断减少,所以可以先搜索数字多的行,可以大大减少状态数量。
第 4 章 广搜的优化技巧
1):「BalticOI 2011 Day1」打开灯泡 Switch the Lamp On:这道题叫优化spfa。。。使用SLF优化之后就可以跑的很快了。。。连边建图什么的模拟着连就可以了。
2):「一本通 1.4 例 2」魔板:你看,8的全排列也一共就40000多一点,所以我们暴力的存所有的状态,直接暴力bfs,是可以在时间范围内通过的。。。复杂度?8*8!。或许说空间不够?2千万布尔数组开不下???况且也有方法可以吧空间缩成8!。
3):「一本通 1.4 例 3」Knight Moves:这个题,明显的是,跑裸的bfs可以随便过。。。我也不明白这题咋冒出来的。。。当然你可以双向广搜。。
4):「一本通 1.4 练习 1」棋盘游戏:发现每个数不是0就是1,可以用二进制数来表示搜索状态,进行暴力广搜,因为最多也就只有不到七万的状态数,所以可以搜过。
5):「一本通 1.4 练习 2」Keyboarding:貌似不是很简单。。好吧我确实貌似对这道题无能为力。。。题解貌似是预处理了能bfs到那些点,然后进行了判重的处理。
6):「一本通 1.4 练习 3」移动玩具:参照练习1,一模一样。
第三部分 图论
第 1 章 最小生成树
1):「一本通 3.1 例 1」黑暗城堡:最短路计数+乘法原理。。。没什么特别需要说的。。
2):「一本通 3.1 例 2」北极通讯网络:这题,求最小生成树第k大的边。。。可以注意到的是当比k大的边都删掉的时候,整个图可以恰好分成k个联通块(也不一定反正肯定比这个小)。但是删掉这个边之后就会凉凉。所以可以如此所求。
3):「一本通 3.1 练习 1」新的开始:这个题,可以建立一个超级点,然后向所有点连接在那个点上修电站的花费,然后剩下的就按图给的连,跑一个lbt就可以了。
4):「一本通 3.1 练习 2」构造完全图:这个题可以发现,每次连接两个节点,所需要的边是 size[a]*size[b]-1,然后边权一定要更大,所以边权为E(a,b)+1,对树跑一遍最小生成树,然后每次合并的时候计算就可以了。
5):「一本通 3.1 练习 3」秘密的牛奶运输:求次小生成树的题目,可以使用倍增在求出最小生成树之后找边。注意重边不能忽略。
6):「一本通 3.1 练习 4」Tree:考虑选出部分白边,给所有的白边加上一个偏移量k,然后跑最小生成树,如果使用的白边数量多了,就继续增加k,否则减少k。
7):「一本通 3.1 练习 5」最小生成树计数:这题嘴上说着最小生成树计数,实际上有一个鬼畜的条件,具有相同权值的边不会超过 10 条。所以对于生成树上的每条边直接枚举和这条边边权相同的边是否也能连接成最小生成树就可以了。。。
8):「一本通 3.1 练习 6」次小生成树:额。。。。。。
第 2 章 最短路
1):「一本通 3.2 例 1」Sightseeing Trip:最小环问题广为人知有三次方做法,加上路径记录就可以通过此题了。
2):「一本通 3.2 例 2」拯救大兵瑞恩:这题是那个网络流二十四题里的那个孤岛营救。。状压最短路,用一个S表示到了某个点时的状态是什么,然后注意一旦拿到了一把钥匙之后就可以畅通无阻了。
3):「一本通 3.2 例 3」架设电话线:可以二分一个最终答案k,显而易见的是,比这个k小的都变成免费的了,所以重赋边权为0,大于这个值得边权为1,那么跑一遍最短路,即可找出是否合法,然后进行收缩就可以了。
4):「一本通 3.2 练习 1」农场派对:首先,跑一遍最短路,然后建立反图,在跑一遍最短路,把两次结果加起来可以得出答案。
5):「一本通 3.2 练习 2」Roadblocks:这个,找次短路,可以在更新最短路的时候顺手更新了。记录的东西不是很多。
6):「一本通 3.2 练习 3」最短路计数:当新搜索一条边时,如果和旧边一样长,就增加计数,否则就清零计数,然后更新最短路。
7):「一本通 3.2 练习 4」新年好:首先五遍最短路暴力算出来每个点到其他五个点的最短距离,然后暴力枚举走的点的顺序,取min即可。
8):「一本通 3.2 练习 5」最优贸易:某年noip原题,具体来说就是从起点跑一遍最短路再开反图从终点跑一遍最短路之后求和就可以了。
9):「一本通 3.2 练习 6」汽车加油行驶:流量全是1的费用流,嗯,最短路。。。建立分层图,模拟连边,注意一下能加油就加油,处理一下直接转移就可以了。
10):「一本通 3.2 练习 7」道路和航线:裸的spfa。。。
第 3 章 SPFA 算法的优化
1):「一本通 3.3 例 1」Word Rings:首先先把能连到一起的单词之间都连上边,然后二分一个最终答案k,用spfa跑正环即可。
2):「一本通 3.3 例 2」双调路径:看了半天看懂题了。对于每种,要求不能有另一条路的花费和时间都比它小,那么用f[i][j]表示到i点费用为j时的时间最短路,跑分层图就可以了。
3):「一本通 3.3 练习 1」最小圈:先二分一个平均长途,然后将所有边都减去这个边的长度,看看能否找出负环,相应的更新二分范围。
4):「一本通 3.3 练习 2」虫洞 Wormholes:思考我们什么时候可以回到过去,假设我们有一个负环,我们是不是可以一直在这个负环里绕绕绕绕绕绕然后把时间变成无限从前,然后回到起点,本来这样没问题来着。。。但是LOJ这里有个鬼畜条件:在出发时刻之前回到出发点。。因为图是有向的,所以你不一定能回去,所以还得先建反图判断。。麻烦。。
5):「一本通 3.3 练习 3」Easy SSSP:有向图找负环不保证联通。。。所以乍一看有起点但是实际上需要从每个点都跑负环。
第 4 章 差分约束系统
1):「一本通 3.4 例 1」Intervals:考虑题目给出的条件并转化,设Si表示[0...i]中的元素个数,那题目条件转化为Sbi-Sai>=ci。然后可以列出其余的两个式子Si - Si-1>=0 ,Si-1 - Si>=-1。spfa求解。
2):「一本通 3.4 例 2」出纳员问题:论文题,不等关系又多又不好想。。考虑使用Si表示从0到i一共雇佣的人数。那么则有S[i]-S[i-1]>=0,S[i]-S[i-1]<=h[i]; S[23]-S[0]>=sum。对于人数的限制,则可以发现S[i]-S[i-8]>=r[i]。跑出最长路求解即可。
3):「一本通 3.4 练习 1」糖果:此题比较容易,S[i]可以表示从i号小朋友一共分了多少糖果。那么首先从0向所有小朋友连边表示要分到一个糖果。然后对于1,3,5可以列出不等式大概为S[i]-S[j]>=0,通过2,4,可以大概列出S[i]-S[j]>=-1。连完边之后跑最长路即可。
4):「一本通 3.4 练习 2」排队布局:某胡策的模板题。。。实话说题目说的有够明白,吧所有的不等式关系都告诉你了,直接连边跑就可以了。
第 5 章 强连通分量
1):「一本通 3.5 例 1」受欢迎的牛:思考那些牛这辈子都不会受欢迎,当然就是在它没有入度的时候,相反的如果有一部分牛没有出度,那么除了这些牛之外的牛肯定都不会是答案。所以此题就是找出度为0的强连通分量。特殊的,如果有两个以上,则此题无答案。
2):「一本通 3.5 例 2」最大半连通子图:可以上来先缩个点什么的,因为在同一个环中的点肯定能够互相达到,然后记录一下点权。然后貌似可以用最短路计数的方式来搞定这道题,具体来说就是先弄个超级源汇出来,然后往所有没有入度点都给它连上一条0边,然后向所有点跑最长路,然后在所有没有出度的点上记录。
3):「一本通 3.5 练习 1」网络协议:这题上来先缩点没差了,然后记录一下有多少个入度为0的点,直接写就行。第二问就是在问怎么把一个dag通过加边变成强连通图。入度为0的点和出度为0的点取max就可以了。
4):「一本通 3.5 练习 2」消息的传递:如题所示这个题就是上面那个题的第一问。
5):「一本通 3.5 练习 3」间谍网络:先缩点缩点缩点,保留点权为环里面能被贿赂的点的最大值,然后看一下所有入度为0的点是不是都能贿赂。。。然后,没了。
6):「一本通 3.5 练习 4」抢掠计划:首先缩点,点权为点权和。然后spfa找最长路,嗯。。真简单。
7):「一本通 3.5 练习 5」和平委员会:呵,把2-sat模板题放缩点里面,好似吧带花树模板题放并查集里面。
第 6 章 割点和桥
1):「一本通 3.6 例 1」分离的路径:边双。。然后要把所有叶子节点都连起来。。所以答案就是叶子节点个数/2-1。
2):「一本通 3.6 例 2」矿场搭建:点双,有几个bcc就要造几个出口。。然后就是各个bcc大小的积,在算的时候注意把割点的大小去掉。
3):「一本通 3.6 练习 1」网络:求割点。。。割点,没了!!!!!
4):「一本通 3.6 练习 2」嗅探器:求点双,然后如果a和b在一个bcc里,那就没有答案,否则a和b路径之间所有的bcc全是答案。找到最小的输出就可以了。
5):「一本通 3.6 练习 3」旅游航道:求割边。。。割边,没了!!!!!
6):「一本通 3.6 练习 4」电力:求点双,算一下哪个割点向bcc连出的边最多,没了。想到一个问题,就是本身图有可能不连通。那么加上就可以了。
7):「一本通 3.6 练习 5」Blockade:这个题看着还挺容易,仔细想想又有点问题。首先每个点封锁了之后,自己肯定是到不了任何一个点的,这个先算上,然后对于不是割点的,明显没有其他点对。是割点的,就对这个割点割掉后形成的联通块进行乘法加法原理。大小可以在回溯的时候算出来。。
第 7 章 欧拉回路
立flag,noip绝对不考这东西。
第四部分 数据结构
第 1 章 树状数组
1):「一本通 4.1 例 1」数列操作:要求维护数列,支持单点加和区间求和,1e6的数据线段树的大常数可能过不去。使用树状数组求解。
2):「一本通 4.1 例 2」数星星 Stars:y坐标给出的是递增的,省的排序了,这样就直接压掉一维,可以使用树状数组或线段树计算x坐标。
3):「一本通 4.1 例 3」校门外的树:给出数列要求支持区间加和区间求和。建议使用线段树。数据是绝对可以过得。
4):「一本通 4.1 练习 1」清点人数:给出数列支持单点修改区间查询。。可以用树状数组。然而每次都查1~x的这类的区间,所以是不是还有什么奇技淫巧之类的。。
5):「一本通 4.1 练习 2」简单题:数列要求维护区间异或和单点查询,建议使用线段树。
6):「一本通 4.1 练习 3」打鼹鼠:二维树状数组。。仍然让你支持单点加区间查询。额,直接写好像就行。
第 2 章 RMQ 问题
1):「一本通 4.2 例 1」数列区间最大值:看着数据,询问个数比数列长度大10倍,嗯。。。线段树强上,可以通过。
2):「一本通 4.2 例 2」最敏捷的机器人:使用单调队列之后,那些带log算法在这都变成渣渣了。
3):「一本通 4.2 例 3」与众不同:好像这题没啥奇怪的方法了,老老实实写RMQ。。。
4):「一本通 4.2 练习 1」天才的记忆:线段树强上。
5):「一本通 4.2 练习 2」Balanced Lineup:线段树强上。
6):「一本通 4.2 练习 3」选择客栈:实话实说,这种有线性做法的题放这真的好么?常数再小照样被吊起来打啊。说一下贪心,当前枚举到一个客栈i,这个i是第二个客栈,那么显然第一个客栈一定在第二个客栈之前,编号必定是0~i-1之间的一个数。如果我发现枚举的时候在某一个客栈前面有一个价钱合理的咖啡厅,那么在这之前的任何一个同色客栈都是第一个客栈可以选的。
第 3 章 线段树
1):「一本通 4.3 例 1」区间和:请使用上面的树状数组写这个题,否则常数太大。
2):「一本通 4.3 例 2」A Simple Problem with Integers:线段树模板题,支持区间加和区间求和。
3):「一本通 4.3 练习 1」最大数:这个题,用单调队列吧,BZOJ线段树一直在T。
4):「一本通 4.3 练习 2」花神游历各国:考虑一个数开根开多少次会变成1,大概6次???所以给每个点标记一下,如果不是1就暴力开,是1就可以打上标记以后不管了。这样就可以通过此题。
5):「一本通 4.3 练习 3」维护序列:还以为是某年noi的那个,然而却是这个,没啥说的,直接上线段树可以轻松搞定。
第 4 章 倍增求 LCA
1):「一本通 4.4 例 1」点的距离:首先随便找个点,然后直接一路dfs求一下每个点的dep,然后对于询问的点对,进行差分,答案就是dep[i]+dep[j]-2*dep[lca]+1;
2):「一本通 4.4 例 2」暗的连锁:先把主要边连上,这样可以得到一棵树,题目转化成一棵树,其中有非树边,我们要删掉一条树边和一条非树边,使这棵树不连通。可以发现对于每条非树边(x,y),它会和树上的路径构成一个环。所以第一步的路径对应的要切断两条或以上的非树边,就没有办法了。所以我们枚举每条非树边(x,y),把x到y路径上所有边的边权+1,对于每条树边,如果边权为0,则切断它之后原图已经不联通,第二条边随便切一条,共m种方案。如果边权为1,则第二步必须切断对应的那条边,方案数1,如果边权大于2则没有方案。
3):「一本通 4.4 例 3」异象石:说一道和这个题很像的题,SDOI2015寻宝游戏。。。我比较奇怪平衡树和虚树是怎么放到这来的。。。还是带花树算并查集已经成为广为人知的事实了???
4):「一本通 4.4 例 4」次小生成树:上面有这个题了。
5):「一本通 4.4 练习 1」Dis:可以参考上面例1点的距离那道题。
6):「一本通 4.4 练习 2」祖孙询问:求一下每次询问使这两个点的距离和他们到他们lca的距离,如果他们之间的距离大于任何一个点到lca的距离,输出0。否则这两个点就有关系,那个深那个是儿子。去他边去,直接lca就行了。
7):「一本通 4.4 练习 3」聚会:每次找两个点的lca,然后让剩下的那个点跑到那个lca,贪心选取就可以了。注意三种情况都要计算。
8):「一本通 4.4 练习 4」跳跳棋:怎么说呢,建议去网上搜详细题解。。。略提一句就是把从中间向两边跳的状态设为此时状态的两个儿子,这样就得到了一棵树,题目变成了求树上两个点的距离。在坐标范围小的时候可以通过。坐标大的时候需要优化。
第 5 章 树链剖分
1):「一本通 4.5 例 1」树的统计:啥时候ZJOI出过这么简单地题。。。学会了树链剖分之后,可以直接上这个题了。树链剖分可以转:
2):「一本通 4.5 练习 1」树上操作:这个依然是学会树链剖分之后就可以直接上了。注意加子树的时候别加多了。
3):「一本通 4.5 练习 2」软件包管理器:思考这个操作的本质是什么。install操作就是把节点到根的部分都变成1,uninstall操作就是把这个节点为根的子树全变成0。考虑线段树上的区间覆盖,使用树链剖分实现即可。
4):「一本通 4.5 练习 3」染色:树链剖分好题,线段树记录lc,rc,tag。注意合并左右子树的时候如果左右颜色相同要ans-1。在树链剖分的时候,也要查看一下和父亲连的部分是不是同色。
5):「SDOI2014」旅行:树剖+动态开点线段树。。。。。。
第 6 章 平衡树 Treap
1):「一本通 4.6 例 1」营业额统计:每次向里添加数,然后求其前驱后继,取min即可。
2):「一本通 4.6 练习 1」宠物收养所:建立一棵领养树和一棵宠物树,根据数量进行领养即可。查询前驱后继。
3):「一本通 4.6 练习 2」郁闷的出纳员:对于新添加进的成员,我们在数列中添加minn-k,然后设置一个计数器,在外部计算工资的涨幅,如果工资涨了,直接加,皆大欢喜,如果降了,那么减去降的部分,将minn-计数器加入到树中并将小于它的都移到根的左子树然后直接断掉。
4):「一本通 4.6 练习 3」普通平衡树:平衡树的所有基础操作,很值得一做。
第五部分 动态规划
第 1 章 区间类动态规划
1):「一本通 5.1 例 1」石子合并:f[i][j]表示合并i,j所用的最大价值,前缀和优化后转移方程为f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+sum[j]-sum[i]),求最小同理。
2):「一本通 5.1 例 2」能量项链:f[i][j]表示合并i~j所用的最大价值,可以直接转移,方程为f[i][j]=max(f[i][j],f[i][k]+f[k][j]+a[i]a[j]a[k])。
3):「一本通 5.1 例 3」凸多边形的划分:对于任何两个点i,j都可以将其从中间一个点k划分成两个多边形和一个以i,j,k为顶点的三角形,可以得出转移为f[i][j]=min(f[i][j],f[i][k]+f[k][j]+a[i]a[k]a[j])。
4):「一本通 5.1 练习 1」括号配对:直接配对转移即可,最终答案为n-配对成功数。方程f[i][j]=max(f[i][j],f[i][k]+f[k+1][j])。
5):「一本通 5.1 练习 2」分离与合体:分离可以直接区间DP,f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+(a[i]+a[j]*a[k]),输出方案可以DP的时候顺手记录。
6):「一本通 5.1 练习 3」矩阵取数游戏:可以发现的是每行的选取是互不影响互不干扰的,可以对每行单独DP,得到方程为f[i][j]=max(a[i]2^k+f[i+1][j],f[i][j-1]+a[j]2^k),然后高精。
第 2 章 树型动态规划
1):「一本通 5.2 例 1」二叉苹果树:可以用f[u][i]表示当前节点u的子树中切割i条边的最大值,那么中心方程就是:f[u][i]=max(f[u][i],f[u][i-k]+f[v][k])。
2):「一本通 5.2 例 2」选课:这题就是一树形背包,还是有依赖性的。可以直接n^2DP。方程:f[u][i]=max(f[u][i],f[u][i-k-1]+f[v][k])。
3):「一本通 5.2 例 3」数字转换:这个题可以比较容易明显的发现是让你找最长链。但是一个森林找最长链貌似不是很靠谱啊,可以发现最长链一定会在包含1这棵树中,然后两遍dfs找最长链就行了,树形DP?算了吧。
4):「一本通 5.2 例 4」战略游戏:上一个没选这一个必选,上一个选了这一个也可以选,直接0/1表示是否选,然后暴力DP。
5):「一本通 5.2 例 5」皇宫看守:状态可以设三维,f[x][0/1/2]可分别表示这个点由他儿子管,由他自己管,由他爹管三种状态。0:儿子自己守或让孙子守都行。2:儿子怎么来都行。1:找一个最小儿子来守着自己就行了,其他儿子自己搞自己,再让孙子守也行 怎么小怎么来。
6):「一本通 5.2 练习 1」加分二叉树:区间DP跑错地方,f[i][j]=max(f[i][j],f[i][k-1]*f[k+1][j]+f[k][k]);遍历不说。。
7):「一本通 5.2 练习 2」旅游规划:找一棵树所有的最长链。可以分几步:1.找到直径,2.从直径一段,标记最大深度以及每个点的父亲。3.从同一段再次dfs,如果dfs到一个点等于最大深度,那么将其到根(为了方便),所有的点打上标记。树形DP?算了吧。
8):「一本通 5.2 练习 3」周年纪念晚会:没有上司的舞会。。。情况很少,就三种,儿子来我不来,儿子不来我来,儿子和我都不来。
9):「一本通 5.2 练习 4」叶子的颜色:状态比较少,三种,0/1/2表示黑白不染。那么不染色的话就在儿子里找个最小的,黑色的话儿子就不用染黑,白色同理。
10):「一本通 5.2 练习 5」骑士:若干基环树,一条边的两个端点不能同时选,挺像没有上司的舞会那题的。断基环,从断的边的两个端点分别舞会,嗯。。。简称断基跳舞。
第 3 章 数位动态规划
1):「一本通 5.3 例 1」Amount of Degrees:数位DP套路一般无非两个,大力记忆化搜索,大力预处理后直接DP。。各有利弊。此题可以转化为求三进制数下1的个数为k的个数。满足可减性,直接大力预处理就可以了。
2):「一本通 5.3 例 2」数字游戏:像这种对于数字位数前后关联如此紧密的,大力预处理出第i位首位是j的不降数是多少个,然后用求前缀和的方法直接跑就可以了。
3):「一本通 5.3 例 3」Windy 数:f[i][j]表示前i位最高位是j时合法的数的个数。直接利用可减性暴力预处理完了之后暴力计数就可以了。
4):「一本通 5.3 练习 1」数字游戏:恶~跟刚才那个还不是一道题。。依然可以用上述二维表示,但是此题增加以为当前和是[k]更好写也更便于理解,由于一直满足可减性,所以前缀和是好东西。
5):「一本通 5.3 练习 2」不要 62:我已经写腻数位DP了。。。可以同上表示,然后满足可减性,所以大力预处理,预处理完之后暴力减,哎。
6):「一本通 5.3 练习 3」恨 7 不成妻:完全平方公式差分之后,开三个DP数组记录,本质仍然是上面那个套路,写起来应该比较难写。。。
7):「一本通 5.3 练习 4」数字计数:这题你可以数位DP,但是,但是,但是这个题有找规律瞎搞方法跑的飞快不说代码还贼短。。。经过仔细研究,发现,算了,自己找吧。。DP就是开三维,数位,填数前导零,跑上10次,建议记忆化搜索,因为要跑10次。。。
第 4 章 状态压缩类动态规划
1):「一本通 5.4 例 1」骑士:这题不应该叫互不侵犯么?预处理一下每一行的合法状态所对应的棋子个数,然后直接大力枚举这一行和上一行所有状态,f[i][j][k]表示i行状态为j用了k个,转移即可。
2):「一本通 5.4 例 2」牧场的安排:这题不是叫玉米田么?首先预处理一下每一行的合法状态是哪些,然后又可以大力枚举上一行和这一行。说白了就是刚才那题的简单版。
3):「一本通 5.4 练习 1」涂抹果酱:三进制的状压DP,其实实际上跟刚才那俩题差不了多少,首先大力预处理出来对于一行合法的状态,然后枚举上一行以及这一行,由于三机制,所以只能O(n)而不是O(1)判断是否合法了。
4):「一本通 5.4 练习 2」炮兵阵地:做法还是那么个做法,首先预处理是需要的,然后由于每一个部队能影响到下面两行,所以要枚举上一行和上上一行的状态。但由于每一行合法的状态数有限,所以可以枚举通过。
5):「一本通 5.4 练习 3」动物园:这个题就比较有意思了,发现每个小盆友最多能看五个格子,所以先预处理一下每个位置往后五个格子的状态能满足多少个在这个格子看的小盆友,然后DP一下,f[i][j]=max(f[i-1][(j&15)<<1],f[i-1][(j&15)<<1|1])+num[i][j]。
第 5 章 单调队列优化动态规划
1):「一本通 5.5 例 1」滑动窗口:模板题海星,就保持大于K队头出队,最优的往里入队就行了。
2):「一本通 5.5 例 2」最大连续和:考虑一段的和可以怎么表示,利用前缀和进行,对于一个s[i],求出i~j的一段的和,则s[j]越小答案越大,更新答案即可。
3):「一本通 5.5 例 3」修剪草坪:仍然和刚才一样考虑,只不过加上一个DP,表示到i时的最大效率,单调队列的使用参照上一个题。
4):「一本通 5.5 例 4」旅行问题:先做完前缀和之后可以发现我们是要找这个区间是否出现负数。考虑转化成例一,求出最小值,可以发现顺逆时针互不影响,分别DP即可,可以用reverse比较方便。
5):「一本通 5.5 例 5」Banknotes:这题,多重背包优化,因为可以单调队列优化所以放这里了。。。实际上二进制优化照样能过。关于单调队列优化多重背包请上网查询。
6):「一本通 5.5 练习 1」烽火传递:初赛的完善程序。。。每m个数里至少取一个,让和最小,这没啥说的,DP就行了。f[i]=min(f[q[head]]+a[i],f[i]);
7):「一本通 5.5 练习 2」绿色通道:二分最终答案ans,然后题目就变成了每隔ans个数要选一个数,使选出的数的和小于t。可以看上一个题。
8):「一本通 5.5 练习 3」理想的正方形:单调队列优化的话主要思想就是行和列分别处理,这里推荐使用st表进行操作,也就是枚举所有的合法矩形,然后st表快速查询。
9):「一本通 5.5 练习 4」股票交易:这个题,麻烦的单调队列,一句话绝对说不完。。f[i][j]表示第i天之后拥有j股的最大收益。然后可以分成四种情况转移。