【问题标题】: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]。