我正在阅读关于Cormen的动态编程等关于算法的书。以下是书中的文字
假设我们的汽车工厂有两条称为第1行和第2行的评估线。我们必须确定最快的时间来获得底盘。
最终目标是确定在整个工厂中获得底盘的最快时间,我们用Fn表示。 chasssis必须在1号线或2号线的“n”站一直到工厂出口。由于这些方式中的更快速度是整个工厂中最快的方式,我们有
Fn = min(f1[n] + x1, f2[n]+x2) ---------------- Eq1
Above x1 and x2 final additional time for comming out from line 1 and line 2
我有以下递归方程。考虑以下是Eq2。
f1[j] = e1 + a1,1 if j = 1
min(f1[j-1] + a1,j, f2[j-1] + t2,j-1 + a1,j if j >= 2
f2[j] = e2 + a2,1 if j = 1
min(f2[j-1] + a2,j, f1[j-1] + t1,j-1 + a2,j if j >= 2
设Ri(j)是递归算法中对fi [j]的引用数。
从等式R1(n)= R2(n)= 1
从上面的等式2我们有
R1(j) = R2(j) = R1(j+1) + R2(j+1) for j = 1, 2, ...n-1
我的问题是作者如何使用R(n)= 1,因为我们基本情况为0而不是n,这里我们将如何在代码中编写递归函数 例如C代码?
另一个问题是作者如何提出R1(j)和R2(j)?
感谢您的帮助。
答案 0 :(得分:0)
如果以递归方式解决问题,你会怎么做? 你开始计算F(n)。 F(n)会递归调用f1(n-1)和f2(n-1)直到到达叶子(f1(0),f2(0)),对吗?
因此,这就是递归解决方案中对F(n)的引用数量为1的原因,因为您只需要计算一次f1(n)和f2(n)。这不适用于f1(n-1),它是在计算f1(n)和计算f2(n)时引用的。
现在,他怎么想出R1(j)= R2(j)= R1(j + 1)+ R2(j + 1)? 好吧,以递归方式计算它,每次你需要f1(i)时,你必须为区间[0,i]中的每个j计算f1(j),f2(j) - 每个j更小的AKA比我。 换句话说,f1,2(i)的值取决于f1,2(0..i-1)的值,所以每次计算f_(i)时,你都计算每个f1,2( 1..i-1) - (因为它取决于它们的值)。
因此,计算f_(i)的次数取决于“在他之上”有多少f1,2。
希望这很清楚。