【发布时间】: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。
-
您的函数
f和g定义不明确,为零。从 n = 1 开始 -
@ColonelPanic:我不这么认为。尽管使用 n = 1 作为基本情况可能更容易,但使用 n = 0 作为基本情况也可以。看看我的回答,如果我错了,请告诉我。
-
@SeMeKh:您还可以找到
f(-1)和g(-1)的“有效”值,但这并不意味着它们是明确定义的。在这种情况下,最简单的方法是从 n=1 开始。
标签: algorithm dynamic-programming