我是动态编程的新手并且遇到了这个例子。
你有n步攀登。你一次只能爬1步或2步。 找到达到第N步的方法数量。
溶液是..T(n)= T(n-1)+ T(n-2)我做的最后一步是什么?
我要么是n-1步,要么是n-2步。现在,达到第N步的方式的数量如何是达到n-1步和n-2步的方式的总和。我无法获得打破逻辑所需的直觉。请帮助。
P.S我可以在递归中为此编写代码。
答案 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}}。希望这有帮助!