River Crossing解题报告

来源:互联网 发布:做淘宝怎么ps图片 编辑:程序博客网 时间:2024/06/10 03:27

题目:http://acm.pku.edu.cn/JudgeOnline/problem?id=1718

 

      该题第一个需要考虑的便是收敛性问题,即是否有解(河岸(n+1)是否可达)。乍一看,这个问题似乎很难解决。想象一下用“万能”的暴力搜索法来解此题的情况,我们很可能在河岸0和河上的几个pole之间无限地递归搜索下去。目标甚至可以选择一直静止在河岸0上。这样的情形有点类似数学中“封闭”或“闭包”的概念:我们可以在闭包内无限循环,但永远也跳不出闭包的限制。类似地,实数对加减等运算封闭,可以无限多次进行相关运算,得到无限多种结果,但始终逃不出实数的范围。对于此题,我们也可类似地定义一个闭包,它是从河岸0开始经过有限多次定义的跳转操作可以到达的位置集合。这样,判断问题是否有解即判断河岸(n+1)是否属于这个闭包。
   
      无限循环可以分为两种,一种是非周期循环,如不断地做自增操作;另一种是周期循环。到目前为止,基本还未在计算机上处理过非周期循环的情况,处理的绝大多数无限循环都属周期循环一类。数论中的模运算是一个经典的、也是常见的周期循环例子。对于周期循环,我们仅需任意处理一个周期,就可以得到整个闭包。比如n mod 7就是以7为周期,闭包为[0, 6]。当然,在很多时候问题并没有这么单纯,我们可能需要专门记录每一个状态的出现,并通过判断新计算出的状态是否已被记录过来判断一个周期是否处理完毕,或闭包是否计算完整。回顾之前在TopCoder上不止一次遇到过这样的题目。还记得某次开辟了一个三维数组来记录状态是否出现,因为状态由一个三元组唯一标识。
   
       回到题目,由于各pole的沉浮明显是周期性的,所以完全有理由猜测整个过程也是周期性的。进一步地,由数论知识我们还可以发现所有pole的总周期就是各个pole周期的最小公倍数。乍看之下,所有pole的一个格局似乎并不能唯一标识整个问题的一个格局,因为还有目标当前所处位置没有考虑进去。但经过仔细思考之后可以发现事实比较蹊跷。设pole的总周期为T,则在T时刻,所有pole都处于下沉状态。此时目标只可能位于河岸0或河岸(n+1)上。如果位于河岸(n+1),则问题得解;如果位于河岸0,则此时整个格局与初始格局(0时刻格局)相同,状态进入一个新的周期开始重复。所以,可以认为T即是整个问题的周期:只要求得在T时间内(包括T),从河岸0出发可以到达的位置集合,就求得了在有限时间内从河岸0出发可以到达的位置集合,即问题的闭包。

      有了上面的分析,问题开始变得清晰明了了。若已知t时刻目标的可能位置,则要求(t+1)时刻目标的可能位置并不难,且开始时刻0时刻目标的可能位置信息已知(即河岸0)。由此,考虑使用基于数学归纳法的动态规划。从1时刻开始不断根据上一时刻目标的可能位置信息计算当前时刻目标的可能位置信息,直到发现当前时刻河岸(n+1)可达或时刻已递增到T。若前一种情况出现,当前时刻即是问题的解;若后一种情况出现,问题无解。

      本题使用动态规划策略解决。一般而言,动态规划类问题的难点首先在于识别出该问题动态规划可解,其次在于准确分析出状态转移方程。不过对于本题,难点并不在此两处,而在于确定动态规划什么时候结束。这样的DP问题往往存在状态循环,状态按一定周期不断重复,而DP结束的条件就是已处理完完整的一个周期。一轮周期的结束,新一轮周期的开始可以通过记录已出现状态并检查新计算出的状态是否已出现过来判断。在确定周期的过程中还常常会用到数论中的模、最大公约数、最小公倍数等相关知识。非周期性无限迭代虽然不常见,但也是存在的,如基于DP策略的Bellman-Ford算法。当在含有负环的图上运用未加任何限制的Bellman-Ford算法时,将陷入无限不循环迭代。原因很简单,由于负环的存在,无论什么时候,我们总能找到一条比当前最短路径还短的路径。为此,Bellman-Ford算法的高健壮性实现都是加有路径最大长度限制的,以避免无限迭代的出现。这类DP问题的结束条件一般只能通过理论分析人为确定。

原创粉丝点击