给定一个大小为NxN
的方格,每个单元格为空或有障碍物,只阻挡一个单元格,以便最小化从左上角到右下角的路径数量。您只能向下或向右移动一步。阻止一个单元格后,计算从左上角到右下角单元格的路径数。总是至少有3个空单元格。其中两个始终是开始和结束单元格,另一个可以是任何剩余单元格。
计算从左上角到右下角的路径数量的部分非常简单,可以使用动态编程轻松解决。
我坚持的部分是要阻止的一个单元格以最小化路径数量。 Intuition表示要水平搜索网格,并使用最大数量的传入和传出路径阻止第一个单元格。例如,对于网格
..## -> Row 1
..##
....
.... -> Row 4
我会阻止(3,2),因为这会阻塞大部分路径,剩下的路径数量只有一个。但我并不完全相信这是正确的做法。任何见解?
答案 0 :(得分:2)
计算从左上角到右下角的路径数量的部分非常简单,可以使用动态编程轻松解决
这个算法是一个很好的起点。考虑使用数组pathsFromStart[N][N]
来存储从起点到(row, col)
点的路径数的实现。再次运行算法,但现在从最后开始。这为您提供了第二个2D数组pathsFromFinish[N][N]
。
有了这两个阵列,您就可以找到原始问题的答案:如果(row,col)
处的一个点有从前面开始的X路径,那么从终点开始通向它的Y路径,然后,通过删除该点将切割的路径总数将为XY。遍历网格上的所有点,不包括开始,结束和已被阻止的点,并使用
MAX(pathsFromStart[row][col]*pathsFromFinish[row][col])