DP中的递归和n阶梯示例

时间:2014-10-30 02:44:10

标签: algorithm recursion dynamic-programming

我是动态编程的新手并且遇到了这个例子。

你有n步攀登。你一次只能爬1步或2步。 找到达到第N步的方法数量。

溶液是..T(n)= T(n-1)+ T(n-2)

我做的最后一步是什么?

我要么是n-1步,要么是n-2步。现在,达到第N步的方式的数量如何是达到n-1步和n-2步的方式的总和。我无法获得打破逻辑所需的直觉。请帮助。

P.S我可以在递归中为此编写代码。

3 个答案:

答案 0 :(得分:1)

动态编程解决方案

T(n) = T(n-1) + T(n-2)基本上是用于查找n斐波纳契数的递归算法。现在,如果我正确地理解了您的问题,那么您正在尝试为此找到动态编程解决方案。

使用DP,我们只需记住先前的答案,并从之前的答案中计算出新的答案。这基本归结为:

int[] s = new int[n]
s[0] = 0;
s[1] = 1;

for(int i = 2; i < n; i++) {
    s[i] = s[i - 1] + s[i - 2];
}

return s[n - 1] + 1;

其中n是步数,s[n - 1] + 1是达到n步骤的方式的数量。

因此,对于2个步骤,解决方案是(1) + 1 = 2

1 + 1
2

对于3个步骤,解决方案为(1 + 1) + 1 = 3

1 + 1 + 1
1 + 2
2 + 1

对于4个步骤,解决方案为(1 + 1 + 2) + 1 = 5

1 + 1 + 1 + 1
1 + 1 + 2
1 + 2 + 1
2 + 1 + 1
2 + 2

解决方案是(1 + 1 + 2 + 3) + 1 = 8

1 + 1 + 1 + 1 + 1
1 + 1 + 1 + 2
1 + 1 + 2 + 1
1 + 2 + 1 + 1
2 + 1 + 1 + 1
1 + 2 + 2
2 + 1 + 2
2 + 2 + 1

让我们更深入

  

我做的最后一步是什么?

这不能用我们提供的信息来确定。最后一步完全取决于我们选择步骤的顺序。然而,我们能做的是找到最后一步是两步或一步的概率。从上面的插图中可以看出,最后一步为1的概率是:

P(1) = 1 / 1 = 100.0%
P(2) = 1 / 2 =  50.0%
P(3) = 2 / 3 =  66.6%
P(4) = 3 / 5 =  60.0%
P(5) = 5 / 8 =  62.5%

正如我们所看到的,分子和分母都遵循相同的模式;分子只是分母前面的一个斐波纳契数。

因此,最后一步的概率为1:

F(n) = F(n - 1) + F(n - 2), F(0) = 0, F(1) = 1, n >= 0

P(n) = F(n) / F(n - 1), n >= 2

1 / P(n)接近无穷大时,(1 + sqrt(5)) / 2的递归公式实际上会限制在n,这可能更好地称为Golden ratio

了解这一点,最后一步为1的概率为1 / ((1 + sqrt(5) ) / 2),也可以写为2 / (1 + sqrt(5) )。因为这是> 0.5,我们可以说最后一步是可能 1。

您可以在Wolfram Alpha中看到完整的计算。

答案 1 :(得分:0)

达到(第n-2)步然后进行2步的方法,以及达到(n-1)步并且使1步不相交的方式,因为它的'最后一步是在没有绕过(n-1)或(n-2)的情况下,没有其他方法可以达到第n个,并且已经计算了(n-1)和(n-2)

答案 2 :(得分:0)

  

现在,达到第N步的方法数量如何才能达到   达到n-1步和n-2步的方法数量。

这样想。你在n步。你是怎么到达那里的,因为你可以一次爬1步或2步?好吧,您的上一步必须是步骤n-1(步骤1步)或步骤n-2(步骤2步)。现在,有T(n-1)种方法可以达到n-1步骤,T(n-2)种方法可以达到n-2步,这意味着有T(n-2)种方式如果您的最后一步是n,则n-2达到T(n-1);如果您的最后一步是n,则n-1达到n。这些是您最终达到n唯一两种可能性,因此进入T(n-1)+T(n-2)步骤的方式总数为{{1}}。希望这有帮助!