使用n次旅行到达开始城市的方法

时间:2018-04-23 10:53:49

标签: java algorithm

在一些编程比赛中,我看到了这个问题:

  

一个人想要去一些城市并回到那里的城市   他/她开始了。共有5个城市,每个城市都相连   到邻近的城市,即:c1 - c2,c2 - c3,c3 - c4,c4 - c5,c5 -   C1。这个人将从城市1开始旅程。此外,这个人   有一些有限的旅行用于旅行。从一个城市到另一个城市旅行需要花费他/她一次旅行。我们需要找到   一个人可以在特定城市旅行的方式总数   使用分配的旅行次数返回城市1。

Example: 

Input: 4
(means 4 trips are allowed)
Output: 6
(As the output can be large, so it should be modulo 10^9+7)
the possible ways are: 
1-2-1-2-1
1-2-1-5-1
1-5-1-2-1
1-5-1-5-1
1-2-3-2-1
1-5-4-5-1

如果问题对行程数量的限制小于10 ^ 9那么它很容易解决,因为问题具有最佳子结构和重叠子问题。但给出的约束是1 <= n <= 10 ^ 18。我无法初始化维度很长的数组,因此无法应用dp。请帮我解决如何使用dp解决这个问题。或者这个问题只是一种排列或组合类型的问题? 谢谢。

3 个答案:

答案 0 :(得分:1)

我建议:

  1. 以矢量形式存储到达每个城市的方式数
  2. 制定一个矩阵,允许您按1步更新此向量
  3. 使用二进制求幂将矩阵提升到幂n
  4. 通过起始矢量(1,0,0,0,0)
  5. 多个此幂矩阵
  6. 在条目1中读取n步后到达城市1的方式数

答案 1 :(得分:0)

(编辑)

抱歉,读得有点太快了。

如果所有城市都已连接,那么这是一个简单的排列问题。

如果没有,您可以将其视为图形问题,并通过扩展的广度优先搜索解决它,一旦达到可能的行程限制,就会封锁。

答案 2 :(得分:0)

这个问题纯粹是数学问题;答案是一个数学公式,一旦在纸上计算,你只需在你的程序中绘图。

您可以通过前后移动(需要2个步骤的多个步骤)或完成圆圈(需要5个步骤的倍数)来达到初始点。因此,您需要检查n与2和5的可分性,或者,将其置于数学形式,检查n=2*kn=5*q。我们将为2个案例独立计算路径数,但如果n可以对2和5进行整除,我们将添加两个结果(因为n个步骤可以两种方式完成,可以是2的倍数或倍数5)。

如果n=5*q,我们将执行n个步骤作为5个步骤的q个循环。每个循环可以是任一方向,顺时针或逆时针。对于第一个循环,有2种可能性(2个方向),对于第二个循环,另外2个可能性,独立于前一个循环,依此类推。因此,路径数量为2 * 2 * 2 ... = 2 q

如果n=2*k,我们将执行n个步骤作为k个来回路径(前进一步,后退一步)。对于这些k路径中的每一个,有两个方向,因此,对于k个闭合路径,有 2 k 路径。

注意:我为1-2-1之类的路径指定了来回路径或闭路径。实际上,从图论的角度来看,它们也是循环,但我并没有将它们命名为循环,而不是将它们与1-2-3-4-5-1循环混淆。

然而,上述计算没有考虑1-2-3-2-1之类的路径,而只考虑1-2-1-2-1或1-2-1-5-1 。我还在研究那个&gt;我将以现在的方式发布这个答案,以便给出计算结果的灵感。

要考虑的另一个方面是我们可以将n写成2 * a + 5 * b的方式的数量,给出2 a * 5 b 路径。我认为n=2*a+5*b是一个动态方程式。