Algorithm DP左上角与右下角表格填充。什么时候用哪个?

Algorithm DP左上角与右下角表格填充。什么时候用哪个?,algorithm,dynamic-programming,Algorithm,Dynamic Programming,有许多问题需要从左上角(例如:编辑距离)和右下角(例如:回文子字符串)填充表格。 有没有什么直观的解释来说明什么时候使用? 参考资料: 表本身的方向没有任何区别,它在一个简单的索引转换下是同构的。也就是说,您可以通过从该维度的大小中减去该索引,在任何维度中轻松地翻转表。这没有任何区别,你可以说,算法甚至不“知道”你正在这样做,你甚至可以制作一个类似于表的对象,将转换抽象掉,这样代码看起来完全一样,但在深处,有一个表是以相反的方向填充的 子问题的解决顺序必须遵循依赖结构。在“将递归转化为DP”检

有许多问题需要从左上角(例如:编辑距离)和右下角(例如:回文子字符串)填充表格。 有没有什么直观的解释来说明什么时候使用? 参考资料:


表本身的方向没有任何区别,它在一个简单的索引转换下是同构的。也就是说,您可以通过从该维度的大小中减去该索引,在任何维度中轻松地翻转表。这没有任何区别,你可以说,算法甚至不“知道”你正在这样做,你甚至可以制作一个类似于表的对象,将转换抽象掉,这样代码看起来完全一样,但在深处,有一个表是以相反的方向填充的

子问题的解决顺序必须遵循依赖结构。在“将递归转化为DP”检查表中,找到解决子问题的适当顺序实际上是一个重要步骤,它经常被忽略,因为通常有一些琐碎的顺序可以工作,您甚至不必考虑。但例如,以下是Fibonacci递归的结构,由维基百科提供:

您可以在这里看到(从递归定义中也可以立即看到),具有某个参数的调用只依赖于具有较小参数的调用。因此,按照从最低参数到较高参数的顺序填充表是一个有效的顺序,这可以保证当需要表中的单元格时,它已经被计算过了。(通常会进一步优化,以仅保留前两项,而不是所有前两项,但这不是重点)

它并不总是那么简单,特别是在更高的维度中,但在您的编辑距离示例中:(src:geeksforgeks.org)

您可以看到,每个eD(x,y)仅依赖于eD(x-dx,y-dy),其中dx和dy为0或1,而不是同时为0,这是由许多订单满足的,例如(不限于):

  • (y,x)上的词典(在他们的答案中给出)
  • (x,y)上的词典编纂(只需颠倒内循环和外循环)
  • 反对角线
  • 从0,0开始,将填充单元格的矩形向下延伸1步,然后向右,再次向下,以此类推
  • 通过k步扩展它
  • 将空单元格的矩形缩小一步,然后向右,等等
  • 中心为0,0的扩张半径的四分之一圆
你需要保留的是,当eD(a,b)被计算时,它所需要的一切都已经被计算了。这样就有了很大的自由度,你甚至可以把所有填充了单元格的空单元格放到左边和上面,然后随机选择一个来填充。然而,对于这个问题,一个绝对不起作用的顺序是从(m,n)开始填充表格——只需考虑它需要哪些单元格:您还没有填充的单元格(如果可以,那么您可以一步计算出最终答案)

在依赖图方面,任何拓扑顺序都可以工作