我遇到类似这样的问题...
马里奥陷入2d迷宫(M * N阵列)。他目前在第一排(任何一个牢房)。他只限于3种类型的动作 - 向下,向左和向右。每个细胞都有一个水果(+ ve或-ve值)。当马里奥通过细胞时,水果被消耗,因此获得的点数增加或减少,之后水果不再存在。目的是通过让他到最后一排来找到马里奥的最高分。
所以我把问题归结为以下......
可获得尺寸为M * N的二维阵列。每个单元格具有+ ve或-ve值。我们可以向下,向左或向右移动,但这样做会使当前单元格无效(使其为0)。我们必须找到从第一行到最后一行的遍历的最大总和。
我设计的方法:
int maxVal(int[][] mat)
{
int r = mat.length;
int c = mat[0].length;
int[][] maxValues = new int[r][c];
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
if (i == 0 && j == 0) {
maxValues[i][j] = mat[i][j];
mat[i][j] = 0;
} else if (i == 0) {
maxValues[i][j] = maxValues[i][j - 1] + mat[i][j];
maxValues[i][j - 1] = 0;
} else if (j == 0) {
maxValues[i][j] = maxValues[i - 1][j] + mat[i][j];
maxValues[i - 1][j] = 0;
} else {
int temp = Math.max(maxValues[i][j - 1], maxValues[i - 1][j]);
if (j + 1 < c) {
temp = Math.max(temp, maxValues[i][j + 1]);
if (maxValues[i][j + 1] >= maxValues[i][j - 1]
&& maxValues[i][j + 1] >= maxValues[i - 1][j]) {
maxValues[i][j + 1]=0;
}
else if (maxValues[i][j - 1] >= maxValues[i][j + 1]
&& maxValues[i][j - 1] >= maxValues[i - 1][j]) {
maxValues[i][j - 1]=0;
}
else if (maxValues[i-1][j ] >= maxValues[i][j - 1]
&& maxValues[i-1][j] >= maxValues[i][j+1]) {
maxValues[i-1][j]=0;
}
}
else{
if(maxValues[i-1][j ] >= maxValues[i][j - 1])
maxValues[i-1][j]=0;
else if(maxValues[i][j-1 ] >= maxValues[i-1][j ])
maxValues[i][j-1]=0;
}
temp += mat[i][j];
maxValues[i][j] = temp;
}
}
}
return maxValues[r - 1][c - 1];
}
我想反馈我做错了什么,因为我显然忽视了一些事情。
答案 0 :(得分:0)
你应该重新考虑你的方法。您的目标是检查所有可能的路径,然后选择具有最高值的路径。我建议使用递归方法。