在一些编程比赛中,我看到了这个问题:
一个人想要去一些城市并回到那里的城市 他/她开始了。共有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解决这个问题。或者这个问题只是一种排列或组合类型的问题? 谢谢。
答案 0 :(得分:1)
我建议:
答案 1 :(得分:0)
(编辑)
抱歉,读得有点太快了。
如果所有城市都已连接,那么这是一个简单的排列问题。
如果没有,您可以将其视为图形问题,并通过扩展的广度优先搜索解决它,一旦达到可能的行程限制,就会封锁。
答案 2 :(得分:0)
这个问题纯粹是数学问题;答案是一个数学公式,一旦在纸上计算,你只需在你的程序中绘图。
您可以通过前后移动(需要2个步骤的多个步骤)或完成圆圈(需要5个步骤的倍数)来达到初始点。因此,您需要检查n与2和5的可分性,或者,将其置于数学形式,检查n=2*k
或n=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
是一个动态方程式。