问题是如果只能以两种方式移动,则找到从(1,1)(如果存在)到达(m,n)所需的最小步骤数的路径: (x,y)=(x + y,y)或(x,y)=(x,x + y)。
我尝试使用动态编程来完成此操作,但m和n最多可达10 ^ 25,因此不可行。如何调整我的解决方案以使其适用于大量输入?或者有另一种方法吗?
答案 0 :(得分:5)
向后退。说你的目标是(x,y)。如果x> y,那么最后一步必须来自(x - y,y);否则,最后一步必须来自(x,y - x)。 (如果x = y,则此位置无法访问。)向后工作,很容易看到,只有一种方法可以到达任何可到达的目标位置,并且该路径始终是显而易见的。
考虑到这一点,您可以在Euclidean algorithm上使用较小的变体来解决此问题。每个迭代或递归级别代表给定方向上的多个步骤,您可以跟踪在此过程中所需的步骤数。