为什么有些网格路径问题可以用DP解决?
Why are some grid path problems solvable by DP?
假设我有一个带有开始和结束位置的 nxn 网格,我需要获取从开始到结束的所有路径。在每个单元格,我可以在所有 4 个方向上移动:上、下、右、左。我需要找到从头到尾的所有路径。这个问题是一个经典的问题,可以通过bfs/dfs来解决(虽然bfs更常见,因为它更优化,因为我们只需要访问每个单元格一次)。
但是,如果我这么说,现在,在每个单元格中,我们只能在两个方向上移动:向右和向下。 bfs/dfs 也可以解决这个问题,因为它只是原始问题的一个子集。但是,这也可以通过动态规划来解决。在每个单元格中,我们只需要添加到达其上方和左侧单元格的方法数。
我的问题是,为什么这个问题可以用 dp 解决,而不是另一个?是因为方向吗?如果是这样,可以使用什么方向的组合来使它仍然可以通过 dp 解决(例如,如果我们可以在 3 个方向上:左、右、下,那么它仍然可以通过 dp 解决吗?)
这里要理解的是DP不是一种解决问题的技术。它是一种优化技术,可应用于具有重叠子问题的问题,这意味着我们会一次又一次地遇到相同的问题。我们不是多次解决同一个问题,而是将结果保存到一些数据结构中(通常称为 DP table)并直接 return 结果,而不是再次计算相同的问题。
回到你的问题,DP可以应用于这两个问题。在您可以移动到所有 4 个方向的第一个问题中,将有 2 个变量将唯一定义您的问题,首先是您所在的单元格,其次是您移动的方向。您需要方向,因为答案可能会根据您移动的方向而有所不同。您可以使用这 2 个状态来创建您的 DP 状态。
第二个问题也是一样,不过这里只能移动2个方向,DP状态变简单了,只需要考虑上下2个方向即可。
因为第二个问题依赖于最优子问题,而第一个则不然。要计算与顶部单元格的最小距离,您需要做的就是观察您可以从其上方的单元格或从其左侧的单元格到达该单元格。这两种状态都已经计算出来,所以我们可以说这个问题具有“最优子结构”属性,这是动态规划解决方案的直接指标。
但是,如果您使用此方法得出第一个问题的解决方案,您可能会发现您不能这样做,因为您可以从四种方式到达单元格,从上面、从下面、从对,从下面。其中两个子问题还没有计算出来,不能用DP,得想第二种方法
假设我有一个带有开始和结束位置的 nxn 网格,我需要获取从开始到结束的所有路径。在每个单元格,我可以在所有 4 个方向上移动:上、下、右、左。我需要找到从头到尾的所有路径。这个问题是一个经典的问题,可以通过bfs/dfs来解决(虽然bfs更常见,因为它更优化,因为我们只需要访问每个单元格一次)。
但是,如果我这么说,现在,在每个单元格中,我们只能在两个方向上移动:向右和向下。 bfs/dfs 也可以解决这个问题,因为它只是原始问题的一个子集。但是,这也可以通过动态规划来解决。在每个单元格中,我们只需要添加到达其上方和左侧单元格的方法数。
我的问题是,为什么这个问题可以用 dp 解决,而不是另一个?是因为方向吗?如果是这样,可以使用什么方向的组合来使它仍然可以通过 dp 解决(例如,如果我们可以在 3 个方向上:左、右、下,那么它仍然可以通过 dp 解决吗?)
这里要理解的是DP不是一种解决问题的技术。它是一种优化技术,可应用于具有重叠子问题的问题,这意味着我们会一次又一次地遇到相同的问题。我们不是多次解决同一个问题,而是将结果保存到一些数据结构中(通常称为 DP table)并直接 return 结果,而不是再次计算相同的问题。
回到你的问题,DP可以应用于这两个问题。在您可以移动到所有 4 个方向的第一个问题中,将有 2 个变量将唯一定义您的问题,首先是您所在的单元格,其次是您移动的方向。您需要方向,因为答案可能会根据您移动的方向而有所不同。您可以使用这 2 个状态来创建您的 DP 状态。
第二个问题也是一样,不过这里只能移动2个方向,DP状态变简单了,只需要考虑上下2个方向即可。
因为第二个问题依赖于最优子问题,而第一个则不然。要计算与顶部单元格的最小距离,您需要做的就是观察您可以从其上方的单元格或从其左侧的单元格到达该单元格。这两种状态都已经计算出来,所以我们可以说这个问题具有“最优子结构”属性,这是动态规划解决方案的直接指标。
但是,如果您使用此方法得出第一个问题的解决方案,您可能会发现您不能这样做,因为您可以从四种方式到达单元格,从上面、从下面、从对,从下面。其中两个子问题还没有计算出来,不能用DP,得想第二种方法