Java 使用n次行程到达起点城市的方法

Java 使用n次行程到达起点城市的方法,java,algorithm,Java,Algorithm,在一些编程竞赛中,我看到了这个问题: 一个人想去一些城市旅行,然后回到他所在的城市 他/她开始了。总共有5个城市,每个城市都有连接 至其邻近城市,即:c1-c2、c2-c3、c3-c4、c4-c5、c5- c1。此人将从城市1开始旅程。还有这个人 用于旅行的旅行次数有限。从一个城市到另一个城市的旅行花费他/她1次旅行。我们需要找到 一个人在给定的城市旅行和到达目的地的方式总数 使用分配的行程数返回城市1 例子: 投入:4 (表示允许4次行程) 产出:6 (由于输出可能很大,因此应为模10^9+7

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

一个人想去一些城市旅行,然后回到他所在的城市 他/她开始了。总共有5个城市,每个城市都有连接 至其邻近城市,即:c1-c2、c2-c3、c3-c4、c4-c5、c5- c1。此人将从城市1开始旅程。还有这个人 用于旅行的旅行次数有限。从一个城市到另一个城市的旅行花费他/她1次旅行。我们需要找到 一个人在给定的城市旅行和到达目的地的方式总数 使用分配的行程数返回城市1

例子: 投入:4 (表示允许4次行程) 产出:6 (由于输出可能很大,因此应为模10^9+7) 可能的方法是: 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的幂
  • 将该功率矩阵乘以起始向量(1,0,0,0)
  • 在条目1中读出n步后到达城市1的方法数

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

    您可以通过来回移动(需要2个步骤的倍数)或完成循环(需要5个步骤的倍数)来达到初始点。因此,您需要检查n与2和5的可除性,或者,用数学形式,检查n=2*k或
    n=5*q
    。我们将独立计算这两种情况下的路径数,但如果n可与2和5整除,我们将添加这两个结果(因为n个步骤可以以两种方式进行,即2的倍数或5的倍数)

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

    如果
    n=2*k
    ,我们将n步作为k个来回路径(向前一步,向后一步)。对于这k条路径中的每一条,都有两个方向要走,因此,对于k条闭合路径,有2k条路径

    注意:对于1-2-1等路径,我已经给出了往返路径或闭合路径的名称。实际上,从图论的角度来看,它们也是循环,但我没有给它们命名,因为我没有把它们与1-2-3-4-5-1循环混淆

    但是,上面的计算没有考虑路径,例如1-2-3-2-1,而只考虑1-2-1-2-1或1-2-1-5-1。我仍在努力>,我将以现在的方式发布这个答案,为计算提供灵感


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

    如果城市不在一个圆圈内,那么所有的运动都是向左和向右的,左右的运动量相等。但这些城市是一个圆圈。因此,左右移动的次数可能会相差一次循环行走的倍数。我认为剩下的都是“简单”的数学。你有什么想法开始吗?还是你希望我们为你做这件事?如果你完全陷入困境,你可能需要先向你的老师/导师寻求帮助。@AxelH我刚想到dp优先。然后我想这可能是一个排列问题,但我自己无法处理太多。如果问题看起来太简单,也许我应该再试一次。 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