找回密码
 欢迎注册
查看: 172|回复: 1

[讨论] 求路线经过最多站点数的推理题

[复制链接]
发表于 2025-2-24 22:02:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
如图,问题求解。
路径站点.png
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2025-2-25 07:25:35 来自手机 | 显示全部楼层
这个算法题不算太难。
首先可以用数学做过小优化,也就是次数i的范围可以简单削减一下。我们知道任何数模n会形成周期,周期是phi(n)<n的因子,所以最终点的数目是以2和3为底的最小周期的最小公倍数,必然不超过phi(n).

在计算出每个点的坐标后,就可以对它们按横坐标进行排序,横坐标相同的按众坐标从小到大排列然后在次排序基础上动态规划,计算从坐下角到第k个点经过最多中间点的路径。
计算第k个点时,我们只需要考虑前k-1个点中纵坐标不超过它的纵坐标并且拥有最长路径(经过点数目)的那个点,对它的点数目加1即可。最后同样计算右上角的点。
那么唯一问题就是维护一个怎样数据结构可以让上诉计算尽量高效。
比较有意思的是我们知道计算过程中两个点a和b,如果a的横坐标不大于b,最长路径长度也不大于b,后面计算过程就不需要再考虑a了。所以,计算过程我们留下的必然是一个横坐标递增,最长路径长度递减的序列,需要注意的是,这个序列的纵坐标也必然递减。
然后处理下一个点时,我们可以在序列中查找到纵坐标刚好不超过它的那个点,新点的最长路径就是那个点最长路径加1。然后我们需要将这个新点插入到序列中那个点之后,然后查找序列中所有附近的点,是否有横坐标不超过它,但是路径长度小于它的,删除掉。
由于我们上面过程需要不停从序列中查找纵坐标匹配位置和删除相应位置附近点,最好使用有序堆来实现这个数据结构,使得每次上诉操作复杂度为log(n)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2025-3-15 03:57 , Processed in 0.108440 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表