找到流体到达第n个杯子的时间

时间:2014-02-06 16:17:04

标签: algorithm math data-structures

这是我从老师那里获得的另一项任务。

杯子排列成树状结构,如下所示:

  1
 2 3
4 5 6

填充杯子1需要10秒钟,然后溢出到杯子2和3中。(假设没有溢出)。由于水流被分开,杯子2和3然后需要20秒才能填满。总之,通过将水倒入杯子1来填充杯子3,需要30秒。对于杯子5,它需要50秒,依此类推。

这是一张表格,其中包含正确的行和秒流体到达下一个杯子的值。

    1(10)
 2(30) 3(30)
4(70) 5(50) 6(70)

提出的问题是解决这个问题,对于一个行数为r的行,其边界为r <= 50: 鉴于行r和杯子c,该杯子需要多长时间才能填满?

我现在已经对这个问题进行了大约24小时的讨论,而且我并没有接近解决它。我知道这与Pascal的三角形和递归有关。我还想指出,这不是一个分级作业,而是一个老师提出的一个有问题的有趣问题。

编辑: 添加了一个更易于理解的数据结构以及我的笔记。

1:   1
2:  1 2
3: 1 2 3

鉴于这种结构,我已经发现根据下面的公式,水流分布到它下面的杯子的比例与帕斯卡的三角形相关

h(r,c)=P(n,c)/2^(n-1)
where P(n,c) returns the number contained in the according row in Pascal's triangle

然后我用它用以下公式计算秒数:

t(r,c)=(2^(n-1)/P(n,c))*10

前3行确实如此,但之后会因为从杯子上方2杯的水流不同时开始分离而崩溃。

我还尝试了一个递归函数来计算它的父项,它们位于(r-1,c)和(r-1,c-1)并应用前面的公式,但由于我的原因它是不正确的如上所述。

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

这里可以使用动态编程找到解决方案的递归关系: -

if(T(r-1,c-1)<T(r,c)) {

  T(r,c) = T(r-1,c) + (1-F(r-1,c)*(T(r-1,c)-T(r-1,c-1)))/(F(r-1,c-1)+F(r-1,c));
  F(r,c) = F(r-1,c) + F(r-1,c-1);
}

else if(T(r-1,c)<T(r-1,c-1)) {

   T(r,c) = T(r-1,c-1) + (1-F(r-1,c-1)*(T(r-1,c-1)-T(r-1,c)))/(F(r-1,c-1)+F(r-1,c));
   F(r,c) = F(r-1,c) + F(r-1,c-1);
}

else {

   T(r,c) = T(r-1,c-1) + 1/F(r-1,c-1);
   F(r,c) = F(r-1,c-1);
}

for corner cases like  
T(r,1) = T(r-1,1) + 2/F(r-1,1) and T(r,r) = T(r-1,r-1) + 2/F(r-1,r-1) and T(1,1) = 10

F(1,1) = 1/10  

注意:我认为有一种可能的封闭形式但难以解决