Algorithm DP中的递归和n阶示例

Algorithm DP中的递归和n阶示例,algorithm,recursion,dynamic-programming,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我可以用递归编写代码。到达第(n-2)步然后做一个2步的方法,以及到达第(n-1)步和第一步的方法是不相交的,因为它的最后一步是不同的,没有其他方法可以到达第n步,而不绕过(n-1)或(n-2

我是动态规划的新手,我看了这个例子

你要爬n级台阶。一次只能爬1到2步。 找到达到第n步的方法

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

我做的最后一步是什么

我不是在n-1步就是n-2步。现在,达到第n步的方法数怎么可能是达到n-1步和n-2步的方法数之和呢。我无法获得推理所需的直觉。请帮助

p.S我可以用递归编写代码。

到达第(n-2)步然后做一个2步的方法,以及到达第(n-1)步和第一步的方法是不相交的,因为它的最后一步是不同的,没有其他方法可以到达第n步,而不绕过(n-1)或(n-2),这些方法已经为(n-1)和(n-2)计算过了

现在,达到第n步的方法的数量怎么可能是 达到n-1步和n-2步的方法数量


这样想。您正处于
n
th步骤。考虑到你可以一次爬一步或两步,你是如何到达那里的?那么,您的上一步必须位于步骤
n-1
(采取1步)或步骤
n-2
(采取2步)。现在,有
T(n-1)
方法达到
n-1
th步骤,有
T(n-2)
方法达到
n-2
th步骤,这意味着如果您的最后一步是
n-2
T(n-1),则有
T(n-2)
方法达到
n
如果您的最后一步是在
n-1
到达
n
的方法。这是你最终到达
n
的唯一两种可能性,因此到达
n
第四步的方法总数是
T(n-1)+T(n-2)
。希望这有帮助

动态规划解决方案

T(n)=T(n-1)+T(n-2)
基本上是求
n
th fibonacchi数的递归算法。现在,如果我正确理解了您的问题,您正在尝试为这个问题找到一个动态规划解决方案

使用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;
对于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
对于5个步骤,解决方案是
(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

让我们深入一点

我做的最后一步是什么

这不能用我们得到的信息来确定。最后一步完全取决于我们选择的行走顺序。然而,我们能做的是找到最后一步是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
n
接近无穷大时,
1/p(n)
的递归公式实际上限制在
(1+sqrt(5))/2
处,这可能更为人所知

知道这一点后,最后一步为1的概率为
1/((1+sqrt(5))/2)
,也可以写成
2/(1+sqrt(5))
。因为这大于0.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