Algorithm 允许特殊移动的网格游戏-ZCO 2009,P1
给你一个正数和负数的正方形网格。您必须从网格的左上角开始,找到一条到右下角的路径。在每个步骤中,您只能向右移动一个位置或向下移动一个位置。作为特别奖励,您最多可以向左或向上移动一步。请注意,由于这一特殊举措,您可以多次访问某个职位 您的目标是找到具有最大权重的路径,其中路径的权重是沿路径访问的所有数字的总和 大家好!上述问题是我无法解决的:( 现在,在我看来,这个问题的主要困难在于一个人可以采取的特殊奖金行动。我很难决定奖金行动必须在哪里进行,以及如何继续最大限度地利用这一行动。我认为贪婪算法在这里行不通,因为我们还必须考虑未来的步骤,而不是我首先想到了一种算法,它使用贪婪的方法移动并达到最大值,但同样的,它似乎不起作用Algorithm 允许特殊移动的网格游戏-ZCO 2009,P1,algorithm,Algorithm,给你一个正数和负数的正方形网格。您必须从网格的左上角开始,找到一条到右下角的路径。在每个步骤中,您只能向右移动一个位置或向下移动一个位置。作为特别奖励,您最多可以向左或向上移动一步。请注意,由于这一特殊举措,您可以多次访问某个职位 您的目标是找到具有最大权重的路径,其中路径的权重是沿路径访问的所有数字的总和 大家好!上述问题是我无法解决的:( 现在,在我看来,这个问题的主要困难在于一个人可以采取的特殊奖金行动。我很难决定奖金行动必须在哪里进行,以及如何继续最大限度地利用这一行动。我认为贪婪算法
有人能给我建议一些解决这个问题和其他类似问题的方法吗?如果有任何帮助,我将不胜感激。谢谢!如果没有特殊的移动,你可以通过取每个单元格的左上邻域的累积权重的最大值来解决这个问题。通过创建一个NX3矩阵来扩展这个想法,其中3的中心是nxn输入,另外2个移动表示2种可能的特殊移动。然后像往常一样填充中间网格。对于额外网格,最大值也像往常一样从上邻居或左邻居处获取,但也从中心网格中单元格的邻居处获取。最后取三个网格中右下元素的最大值。Let
f(i,j,w)
代表到单元的最佳解决方案,(i,j)
其中w
有三种状态之一:前
,后
和特殊移动后的右
通常:
f(i, j, before) = M(i, j) + max(
f(i-1, j, before),
f(i, j-1, before)
)
f(i, j, after) = M(i, j) + max(
f(i-1, j, after),
f(i, j-1, after),
f(i-1, j, right_after),
f(i, j-1, right_after)
)
f(i, j, right_after) = M(i, j) + max(
f(i+1, j, before),
f(i, j+1, before)
)
JavaScript代码(非备忘录,自下而上,留给读者):
函数f(M,i,j,w){
如果(i==0&&j==0&&w!='right\u after')
返回M[i][j]
如果(i<0 | | i>M.length-1||
j<0 | | j>M[0].长度-1)
返回无穷大
如果(w=='之前'){
返回M[i][j]+Math.max(
f(M,i-1,j,'之前'),
f(M,i,j-1,'之前')
}
如果(w=='之后'){
返回M[i][j]+Math.max(
f(M,i-1,j,'后'),
f(M,i,j-1,'后'),
f(M,i-1,j,'右后'),
f(M,i,j-1,'右后')
}
如果(w=='右后'u'){
返回M[i][j]+Math.max(
f(M,i+1,j,'之前'),
f(M,i,j+1,'before'))
}
}
var M=[
[12, -16, 10, -12],
[-16, 13, -14, 7],
[7, -4, 16, -15],
[-7, 16, -9, 8]
]
var m=m.length
var n=M[0]。长度
console.log(Math.max(
f(M,M-1,n-1,'之前'),
f(M,M-1,n-1,'后')
))
这里并没有完全写出来,但我认为“标准移动”不能多次移动到一个位置,而且奖金移动不是强制性的,对吗?你知道动态规划吗?如果删除特殊移动,你能解决吗?