Algorithm 网格中的最优运动

Algorithm 网格中的最优运动,algorithm,graph,dynamic-programming,Algorithm,Graph,Dynamic Programming,有一个大小为N*M的迷宫,由单元块组成。开始时,Alice有K%的能量。 现在爱丽丝从第一排开始,向第N排移动。她可以从当前区块移动到下一行的区块,该区块位于当前区块的右侧或左侧。当移动到第i行第j列中的一个区块时,如果C(i,j)大于0,她的能量将减少C(i,j)个百分点,否则将以C(i,j)个百分点重新充电 例如,若她有50%的能量,当移动到C(i,j)=15的方块时,她将有35%的剩余能量 现在的任务是找出爱丽丝能量的状态,如果她采取最佳的行动来节省最大的能量 注意:她的能量不会超过100

有一个大小为N*M的迷宫,由单元块组成。开始时,Alice有K%的能量。 现在爱丽丝从第一排开始,向第N排移动。她可以从当前区块移动到下一行的区块,该区块位于当前区块的右侧或左侧。当移动到第i行第j列中的一个区块时,如果C(i,j)大于0,她的能量将减少C(i,j)个百分点,否则将以C(i,j)个百分点重新充电

例如,若她有50%的能量,当移动到C(i,j)=15的方块时,她将有35%的剩余能量

现在的任务是找出爱丽丝能量的状态,如果她采取最佳的行动来节省最大的能量

注意:她的能量不会超过100%,如果能量下降到0%,她也不会再移动

示例:假设网格为4*4,如下所示:

2-2-2

-2-2 2

1-11-1

-11-11

如果K=10意味着她在开始时有10%的能量。到达第四排后,她将有16%的精力。最佳移动方式之一是->->->->->


所以这里的答案是16。

我最初说你可以自下而上解决这个问题,但是我要用手来做这个例子,从上到下,因为当你的能量降到零时,你就不能继续,这在这里不起作用,但是如果你是自上而下工作的话,这看起来更容易处理。校长基本上是一样的——一行一行地工作,在每个阶段写下每个单元格中可能的最佳分数,使用前一行的答案计算出当前行的答案

我们从10开始,我假设你可以从你想要的任何地方开始,所以只要从10减去最上面一行,就可以算出最上面一行的值,包括你现在所在的电池的能量差。第一行变成8,12,8,12

下一行的边缘单元格只能通过一种方式到达。内部细胞可以通过两种方式到达。在任何一种情况下,我们都要计算出总能量,考虑到来自该细胞的能量差和来自该细胞的能量,当有两个细胞时,我们会选择最有希望的。所以我们得到14,10,14,10,其中第二个14是12分之一,在它的左边或上面,还有两个在它的右边(如果分数不同,我们可以取最好的),加上这个单元格的-2

类似地,我们下一行有9,15,9,15,底部有16,8,16,8,例如,到达左下角的唯一方法是从上面的15到它的右边,所以通过-1调整我们将15变成16。有两种方法可以到达右边的单元格,但它们都是从9开始的,所以调整1得到8


如果您需要了解整个路径,您可以在计算每个单元格的最佳成本时跟踪您是如何输入的,然后在完成时从最佳答案开始跟踪您的路径。

@sukunt-huh..请解释什么是最短路径?mcdowella的解决方案是正确的。我没注意到你只能移动downwards@sukunrt事实上,我已经修改了我的答案以改变方向,因为你必须始终将能量保持在0以上-谢谢你的评论,我希望你仍然同意。请在上面的例子中解释..thanx in advanceI我已经修改了答案并投入了大量的精力举例来说,你可以用C++之类的语言提供一些代码或代码吗?你的算法的复杂性是什么?还有一个问题,你在每一行中都是为下一行取当前行的最大值还是检查每行中获得的所有值?固定了每个单元格的少量计算。对于每行中的每个单元格,您可以在上面一行的最多两个单元格中找到最佳选择,因此每个单元格都需要计算上一行最多两个单元格的最大值。