您将获得一个维度为X X n的成本矩阵。问题是找到最小路径 矩阵中的某个单元格的左上角。路径的总成本是路径中访问的所有单元格的总成本。仅允许2个移动:要么逐行下移,要么向右移动一列。你不能随时离开矩阵。此外,一些细胞被标记为障碍物,不能被踩踏。 形式的几个查询:tx ty k将被回答。此查询的输出应为kth 在tx行的ty列上从左上角到单元格索引的路径的最小成本 约束:
1<= m,n <= 100 0 <= tx < m 0 <= ty <n 1 <= k <= 101
The obstacles in matrix are marked by "##" (quotes only for clarity)
The values in every cell that is not an obstacle, varies from -9 to 99 only.
tx and ty are both 0-indexed.
If k exceeds the total paths to cell (tx, ty) output "Not so many paths"
If (tx, ty) is an obstacle, output "Obstacle".
There will never be an obstacle on the top-left corner or bottom-right corner.
Input:
The first line contains the number of test cases T,
The first line of each test case contains two space-separated integers m and n.
The next m lines each contain n integers, denoting the matrix.
The next line contains an integer q, denoting the number of queries to come.
The next q lines each contain 3 space separated integers, tx ty and k
Output:
For each query output the kth shortest path
我尝试的是回溯导致TLE。(时间限制为1秒)。无论何时我到达目标单元格,我都将该路径成本存储在向量中......最后在排序后,向量打印出Kth值vector ...但我需要更有效的方法来解决问题..这里可以使用动态编程.. ???
答案 0 :(得分:1)
我有一个动态编程解决方案。
使用3D矩阵cost[M][N][K]
,其中cost[x][y][i]
将代表从右上角到达单元格(x,y)的第i个最短路径。
请注意,每个单元格(x,y)只能从单元格(x-1,y)和(x,y-1)到达。因此,我们可以使用for循环按顺序处理单元格。这将确保在任何单元格(x,y)的单元格(x,y)之前处理单元格(x-1,y)和(x,y-1)。
for (int x = 0; x < m; x++) {
for (int y = 0; y < n; y++) {
//Process
}
}
假设我们已经计算了单元格(x-1,y)和(x,y-1)的所有k个最短路径,您可以通过对2 *进行排序来计算单元格(x,y)的k个最短路径k个最短路径通过选择最小的成本并且将到达单元格(x,y)的成本加到拾取的路径上,导致单元格(x-1,y)和(x,y-1)。 这可以使用传统的排序算法来完成,每个单元产生O(k log k)时间。但是,由于单元格(x-1,y)和(x,y-1)的k个最短路径已经排序,实际上可以通过使用类似于mergesort的技术在O(k)运行时间对它们进行排序。限制非常紧张。这产生了O(nmk)和存储器O(nmk)的最佳运行时间。
仅通过保存最后一行可以减少内存,因为在计算第x行时只需要x-1行,因此我们可以丢弃x-1行之前的所有行。