【问题标题】:Number of ways of counting nothing is one?数无的方法有多少种?
【发布时间】:2013-03-23 14:22:26
【问题描述】:

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

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

DP解决方案很容易找到

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

g(n):平铺 3xN 网格的方法数,在最右边一列截断 1x1 块

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 网格的方式数量是一种,因为只有一种方式我们不能使用任何平铺(2x1 块)。

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

【问题讨论】:

  • 我喜欢这个问题!它更像是一个“如何思考?”题。我最喜欢解决问题的方法。
  • 我觉得这属于math.stackexchange.com
  • 您的函数 fg 定义不明确,为零。从 n = 1 开始
  • @ColonelPanic:我不这么认为。尽管使用 n = 1 作为基本情况可能更容易,但使用 n = 0 作为基本情况也可以。看看我的回答,如果我错了,请告诉我。
  • @SeMeKh:您还可以找到 f(-1)g(-1) 的“有效”值,但这并不意味着它们是明确定义的。在这种情况下,最简单的方法是从 n=1 开始。

标签: algorithm dynamic-programming


【解决方案1】:

关于你的平铺的具体问题,这样想:

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

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

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

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

【讨论】:

    【解决方案2】:

    在我看来,g(0)无效,因为无法从 3x0 网格中切割出 1x1 块。

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

    一般来说,方式数将 0 个对象或对象放置在 0 大小的空间中有意义为 1(即不放置任何对象)(所以 @987654328 @)。在许多其他情况下,有效值为 0。

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

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

    g(1) = 1  
    f(1) = 0  
    
    g(2): (all invalid, since ? is not populated)
      |X  |X  ?X
      |?  ||  --
      --  ?|  --
    
    g(2) = 0, thus g(0) = 0 - f(1) = 0 - 0 = 0  
    
    f(2):
      ||  --  --
      ||  --  ||
      --  --  ||
    
    f(2) = 3, thus f(0) = 3 - 2*g(1) = 3 - 2 = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-03
      • 2012-08-14
      • 1970-01-01
      • 2016-10-23
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多