【问题标题】:Abstract the "stair climbing" algorithm to allow user input of allowed step increment抽象“爬楼梯”算法以允许用户输入允许的步长增量
【发布时间】:2014-01-22 16:56:41
【问题描述】:

在查看了常见的stair climbing problem 之后,我开始怀疑是否可以将其抽象为一个函数,该函数允许输入楼梯数量和允许的最大增量步骤作为参数。

我希望能够用这个签名编写一个函数。如果max_step_increment 为 4,则意味着爬楼梯者一次可以走 1、2、3 或 4 步。

def stair_paths(num_steps, max_step_increment):
    ...
    return answer

我会将此函数称为stair_paths(10, 4)

【问题讨论】:

    标签: algorithm dynamic-programming


    【解决方案1】:

    用 Java 解决。如果您的方法声明是:

        int stairPaths(int numSteps, int maxStepIncrement)
    

    正如你所定义的,这里是动态编程解决方案:

        int stairPaths(int numSteps, int... stepsAllowed)
        {
            if (stepsAllowed.length == 0) {
                return 0;
            }
            Arrays.sort(stepsAllowed);
            if (stepsAllowed[0] < 1) {
                throw new IllegalArgumentException("Invalid step increment " + stepsAllowed[0]);
            }
             int maxStepIncrement = stepsAllowed[stepsAllowed.length - 1];
            int[] priorElements = new int[maxStepIncrement];
            priorElements[maxStepIncrement - 1] = 1;
            priorElements[maxStepIncrement - 2] = 1;
            for (int i = 2; i <= numSteps; i++) {
                int nextElement = 0;
                for (int j = 0; j < stepsAllowed.length; j++) {
                    nextElement += priorElements[maxStepIncrement - stepsAllowed[j]];
                }
                for (int k = 1; k < maxStepIncrement; k++) {
                    priorElements[k - 1] = priorElements[k];
                }
                priorElements[maxStepIncrement - 1] = nextElement;
            }
            return priorElements[maxStepIncrement - 1];
        }
    

    【讨论】:

      【解决方案2】:

      令 f[n] 表示通过所有允许的步骤到达 n 个楼梯的路径数。

      最初f[0]=1,剩下的都是0。

      那么,f[i]=sigma(f[i-allowedSteps[j]]),其中 allowedSteps[j] 是所有可能的允许步数。

      最后的答案应该是 f[numStairs],在你的例子中就是 f[10]。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-11
        • 1970-01-01
        • 2016-10-13
        • 1970-01-01
        • 1970-01-01
        • 2021-05-18
        • 2019-07-30
        • 1970-01-01
        相关资源
        最近更新 更多