摘要“爬楼梯”算法允许用户输入允许的步进增量

时间:2014-01-22 16:56:41

标签: algorithm dynamic-programming

在查看了公共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)

2 个答案:

答案 0 :(得分: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];
    }

答案 1 :(得分:0)

设f [n]表示通过所有允许步骤进入n阶梯的方式。

最初,f [0] = 1,其余均为0。

然后,f [i] = sigma(f [i-allowedSteps [j]]),其中allowedSteps [j]都是允许的步骤。

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