有一个m行和n列的棋盘格。在每个检查器中,有一个整数表示通过此检查程序的成本。现在我应该找到从左上方检查器到右下方检查器的成本最低的路径。
INPUT
在第一行中有两个整数m和n表示行数和列数。在以下m行中,每行中有n个整数,表示通过每个检查器的成本。
输出
包含表示最低成本的整数的单行。
示例输入
4 5
1 100 1 1 1
1 100 1 100 1
1 1 1 100 1
100 100 100 100 1
示例输出
12
我尝试用动态编程来解决这个问题。如果每个步骤只能向下或向右,那将很容易。但我不知道怎么做,而从四个方向都可以到达检查员。谁能告诉我应该采用什么策略?
答案 0 :(得分:0)
如果成本不能为负,这是一个非常简单的问题:
创建图表。节点表示检查器。如果两个检查器是邻居,则存在边缘。
将每个检查器的成本分配给进入检查器的相应节点的所有边缘的成本。
使用标准Dijkstra Algorithm查找从起始节点到目标的最短路径,时间复杂度为。
否则如果成本可以是任何整数,那就有点复杂了。您可能想用Bellman-Ford Algorithm替换第三步来解决这个问题。那么最糟糕的时间复杂度将是。
答案 1 :(得分:0)
如果每项费用为>= 0
create an 'output' array the same size as the 'cost' array
set all entries in the 'output' array to 'unknown'
the first entry in the 'output' array equals the first entry of the 'cost' array
write the coordinates of the first entry {0,0} to a queue
while the queue is not empty
{
read a set of coordinates from the queue
for each neighboring square
{
compute the cost to move from the current square to the neighbor
if ( the current cost of the neighbor is unknown or higher )
{
set the cost of the neighboring square to the new lower cost
add the coordinates of the neighboring square to the queue
}
}
}
一旦队列为空,输出数组将以最低的成本前往每个方格。下图显示了算法如何与问题中给出的成本数组一起使用。绿色方块是在算法的每次传递中修改的方块。