n楼梯的最大步数

时间:2015-06-02 05:25:09

标签: algorithm dynamic-programming

这是一个家庭作业问题,它是DP,但它不是有多少种方法可以达到第n个阶梯问题'。

相反,在这个问题中,每个阶梯步骤被分配一个从-10000到10000的数字,例如,我有-1 2 1这样的步骤,我必须找到最大的金额,同时能够一步一步或每次跳过一步。在那个例子中答案是3,因为我可以跳过第一步,然后只是访问其余的楼梯。

我注意到我总是可以删除最后一步因为我必须踩到它。

如何以动态编程方式进行此操作?我是否在每一步找到最大的金额?

4 个答案:

答案 0 :(得分:1)

设置一个名为sum[n]的整数数组(或长数或任何将保持加或减10000 * n的数组),如果你站在步骤n上,这是最大的总和。请注意,sum[0]=step[0]是您给出的数组的第0个元素,但sum[1]= max{0+step[1],sum[0]+step[1]}因为您可以直接从地板或通过第0步到达第1步。现在找出sum[2]的类似公式,并进行推广。然后按顺序计算sum[i]

我认为你不能只是“删除最后一步”。你可能不得不踩它,你可以避免它,无论什么是最好的。不过,您可能想要引入值为0的假最后一步。

答案 1 :(得分:1)

如您所知,动态编程就是在提出正确的问题。

这里应该问一个例子的问题:

a = [ - 5,-2,1,3]

如果你踩到2步(数组索引从零开始),其值为1,你可以获得的最大值是多少?

让f [2]定义为2步之前可以得到的最大值。 所以你有选择;你可以踩到它,也可以不踩它。

If (step on 2 step in array index i.e 1)
    you can also step on previous step i.e -2 or skip the previous step
    if (you skip the previous step i.e -2)
        you need to step on previous to previous step i.e -5

从上面你可以看到

   f[2] = max(a[2] + a[1] or a[2] + a[0])

我也在学习,所以我不确定下面是否合适?

F [n] = max(F [n-1] + a [n],F [n-2] + a [n])

答案 2 :(得分:0)

只是一个线索:

假设你想要达到第n步。你可以从步骤n-2或n-1开始。

所以F(n)= Max(F(n-2),F(n-1))+ x [n]

答案 3 :(得分:0)

除了ElKamina的答案之外,请记住,无论你在任何阶段选择做什么(一步或两步),第三项都可以到达......