什么算不算的方法是一个?

时间:2013-03-23 14:22:27

标签: algorithm dynamic-programming

在解决问题时,这是我经常犯的错误。当参数处于最低极值时,我们如何确定递归函数的值是什么。一个例子将有所帮助:

  

给定n,找到仅使用2x1块来平铺3xN网格的方法的数量。允许旋转块。

DP解决方案很容易找到

  

f(n):平铺3xN网格的方式数

     

g(n):在最右边的列中切断1x1块的3xN网格的平铺方式

     

f(n)= f(n-2)+ 2 * g(n-1)

     

g(n)= f(n-1)+ g(n-2)

我最初认为基本情况是f(0)= 0,g(0)= 0,f(1)= 0,g(1)= 1。但是,这会产生错误的答案。然后我在某处读取f(0)= 1并将其推理为

  

平铺3x0网格的方法数量是1,因为只有一种方法我们不能使用任何图块(2x1块)。

我的问题是,根据这个逻辑,不应该g(0)也是一个。但是,在正确的解决方案中,g(0)= 0。一般来说,我们什么时候可以说使用什么方式的数量是一个

2 个答案:

答案 0 :(得分:3)

关于你的特定平铺问题,请这样思考:

  • “平铺3 * 0网格”有多少种方法? 我会说:只是一种方式,不要做任何事情!并且你不能以任何其他方式“无所作为”。 (f(0)= 1)

  • 有多少种方法可以“平铺一个3 * 0网格,切断该特定区域”? 我会说:嘿!这不可能!因为什么都没有,你不能削减特定区块。所以,无论如何都无法解决任务。 (g(0)= 0)

现在,让我们来看一般情况:

  • 关于零案件没有“一般”规则。
  • 根据您的问题,您可以以某种方式“解释”情况,并找到合理的价值。 大部分时间(取决于您对“方式”的定义)做“无”的方式的数量是1,做不可能的方式的数量是0!
  • 警告!能够以某种方式“解释”零案例并不足以使关系正确!你应该重新检查你的递归​​关系(即你从前面的那个得到第n个值的方式)也适用于零对一的情况,因为大多数时候这将是一个“棘手”的情况。
  • 如果您发现零案例很棘手或令人困惑,您可能会发现将递归关系更容易建立在某些非零情况下。

答案 1 :(得分:1)

我看到它的方式,g(0) 无效,因为无法从3x0网格中删除1x1块。

无效值通常表示为0,-∞,但这在很大程度上取决于问题。放置内容的方式数量为0表示无效值是有意义的(否则您的计数将被关闭)。使用min时,您通常会使用。使用max时,通常使用-∞(或可能为0)。

通常,将0个对象或对象放置在0大小的空间中的方式有意义为1 (即不放置任何对象)(所以{{ 1}})。在很多其他情况下,有效值将为0。

但这些远非规则(避免盲目遵守规则,因为你会受到例外的伤害);我能给出的最佳建议 - 如果有疑问,抛出一些价值,看看会发生什么

在这种情况下,您可以轻松确定g(1),f(1),g(2)和f(2)的实际值应该是多少,并使用它们来计算g(0)和f(0 ):

f(0) = 1