在解决问题时,这是我经常犯的错误。当参数处于最低极值时,我们如何确定递归函数的值是什么。一个例子将有所帮助:
给定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。一般来说,我们什么时候可以说使用什么方式的数量是一个?
答案 0 :(得分:3)
关于你的特定平铺问题,请这样思考:
“平铺3 * 0网格”有多少种方法? 我会说:只是一种方式,不要做任何事情!并且你不能以任何其他方式“无所作为”。 (f(0)= 1)
有多少种方法可以“平铺一个3 * 0网格,切断该特定区域”? 我会说:嘿!这不可能!因为什么都没有,你不能削减特定区块。所以,无论如何都无法解决任务。 (g(0)= 0)
现在,让我们来看一般情况:
答案 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