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的扩张半径的四分之一圆