?如果允许负整数和/或零步长,结果是否可以在(楼梯爬升/蛙跳)中找到?

时间:2019-06-12 22:45:19

标签: algorithm

序言:

问楼梯问题时,通常给定的允许步速数组为[1,2,3]

查看关于SO的同一问题的许多示例,例如 n-steps-with-1-2-or-3-steps-taken-how-many-ways-to-get-to-the-top

我的问题与此有关,但是是在为允许的步伐包括负数和零的情况下寻找证据。

诸如此类的明显事物

  • 如果所有步长均为正,则可能的方法数 是有限且可解的。
  • 如果步长为零,则为数字 可能的方法变得无限。
  • 如果至少一个负步长 是允许的,步长的任何组合总和为零,则 可能的方法数量无限。

示例:

countSteps(stairSize:=5, [  1,2,3]) // 17
countSteps(stairSize:=5, [0,1,2,3]) // 17...

countSteps(stairSize:=5, [-2,-1  ]) // zero ways
countSteps(stairSize:=5, [-2,-1,0]) // infinitely zero ways

countSteps(stairSize:=5, [2,4]) // zero ways

countSteps(stairSize:=5, [   3]) // zero ways
countSteps(stairSize:=5, [-1,3]) // infinite ways

countSteps(stairSize:=5, [6,7,8]) // zero ways

问题:

? Can you determine whether given
    a stair size (1.. for now)
    and an array of allowable steps
    is the result find-able ?

1 个答案:

答案 0 :(得分:0)

您可以分为两个部分:

  • 首先,创建一个大小为 stairSize 的布尔数组,该布尔数组表示给定的步骤是否可以从底部到达。将所有值初始化为“ false”(包括底部步骤),然后使用搜索算法(例如BFS或DFS)查找所有可到达的步骤并将其设置为“ true”。
    • 如果最高的步骤永远不会变为“ true”,那么就没有办法从最低处到达最高的步骤;返回0。
    • 否则,如果最下面的步骤以“ true”结束,则存在一个循环;返回∞。 (由于问题的对称性,如果存在循环,最下一步将始终以“ true”结尾。)
  • 接下来,创建一个大小为 stairSize 的整数数组,该数组表示达到给定步骤的方式。将最下面的步骤初始化为1,将所有其他值初始化为0,然后使用递归填充此数组。 (例如,如下所示:
    private int getNumWaysToReachStep(
            final int targetStep,
            final boolean[] isStepReachable,
            final int[] numWaysToReachStep,
            final int[] numStepsAtATimeArr) {
        if (targetStep == 0) {
            return 1;
        } else if (targetStep < 0 || targetStep >= isStepReachable.length) {
            return 0;
        } else if (numWaysToReachStep[targetStep] != 0 || ! isStepReachable[targetStep]) {
            return numWaysToReachStep[targetStep];
        }
        int result = 0;
        for (final int numSteps : numStepsAtATimeArr) {
            result += getNumWaysToReachStep(targetStep - numSteps, isStepReachable,
                          numWaysToReachStep, numStepsAtATimeArr);
        }
        numWaysToReachStep[targetStep] = result;
        return result;
    }
    

总体而言,这需要 O stairSize ·|| numStepsAtATimeArr |)时间和 O stairSize )多余的空间。