摘要:本文是针对不思议迷宫混沌深渊dp最全攻略进行的详细解析。文章从输入输出格式、算法思路、常见问题等四个方面进行阐述,旨在帮助读者全面了解和掌握混沌深渊dp算法。
1、输入输出格式
对于不怎么了解混沌深渊dp算法的朋友们来说,很多时候最挫的的莫过于输入输出格式了。接下来我们来一步步了解其具体的输入输出格式。
输入格式:通过输入读入两个整数N和M。其中N表示不同种类的宝石数量,M表示混沌深渊中发现的宝石数量。
接下来的M行,每行包括三个整数:i, j, k。表示第i种神秘宝石与第j种神秘宝石之间存在一条权值为k的单向边(只需输入有用的边,即k>0的边)。
输出格式:程序你应该输出一个整数,表示所找到创建深渊的最小代价。如果无法创建深渊,则输出-1。
2、算法思路
混沌深渊dp算法可以看作最短路算法的一个进化版。他与之的最大区别在于它可以处理带有负权边的图【但不能有负权回路】,而且在运算时不会超时。
它与最短路算法的相同处在于都是建立在DAG上的。混沌深渊dp算法基于该子集天然是DAG的性质,构造一种可逆向DP求解方法,并基于其最优子结构性质设计出一种高效求解最小路径覆盖的方法。
总体来说,其算法思路如下:
Step1: 构造出一个DAG
Step2: 对于DAG中每个顶点x的所有前驱pre,设f[x][pre],bi[x][pre] 分别表示考虑以x结尾和以pre结尾的最长距离和对应解中,通过对f和bi作一定的组合,即可计算出经过x的最长路径覆盖。
Step3: 在Step2通过的,我们又可以得到v->pre -> x->next(含v==pre为开始节点, x==next为结束节点)这个基础路径的长度L,以及最小代价(即关键点的总数)CA,都可以根据定义算出,那么以v, next为起点/终点,长度为 L + 1, 代价为 CA + (L + 1) - 1的边作为这个图的可行边。
Step4: 对于转化后的图,我们使用拓扑排序,以此来保证邻边与祖先的流转情况,并基于此生成的图计算最短路,即为我们所求的最小代价。
3、常见问题解答
Q1:什么情况下,无法创建深渊?
A: 只有当图中存在负权回路是,才无法创建深渊,否则都可以通过DP算法求解。
Q2:在最后生成的图中,边都有哪些属性?
A: 在最后生成的图中,边的长度为 L + 1,其中 L表示路径的长度。边的代价为 CA + (L + 1) - 1,其中 CA表示每个小区间子串中选择一个代价最小节点的个数。
Q3:什么是可复杂化小区间?
A: 可复杂化小区间是指将区间复杂化(即将区间分为较短的小区间),然后在小区间内找到一个代价最小的节点。不断这样的找,就可以找到所有区间的代价的和。
4、注意事项
1、在处理时,注意DAG的深度遍历时,顺序一定是由叶节点到根节点。
2、引入DAG的时候,注意异构结构的添加,以免计算时发生错误。
3、在DAG中需要以此计算,以V(字母)为终点的路径,有几种分支(用代价最小的点的数目来表示)。
4、在DAG思想下,写DP时一定要从最底层开始,逐渐向上,建立正确的状态转接方程,这样才能保证DP的正确性。
5、在计算可行边的时候,要注意将v,next设为起点和终点后,只能在最小路径覆盖中把从v到next的路径当做已经走过,其他的不算在里头,所以在加边的时候要注意,不要加重复边。
总结:
在混沌深渊dp算法中,重点是建立DAG和计算可行边。只要我们理解了算法思想,我们就可以很轻松的掌握这种算法,同时,我们也需要注意一些细节问题,才能确保程序的运行结果准确无误。
本文由好物分享https://www.00tu.com整理,帮助您快速了解相关知识,获取最新最全的资讯。
标签: