我正在解决有关制定算法的挑战。
有一场土地大战。 Land of Landing游戏由N行共4行组成,所有列均得分。 从第一行向下一行向下移动时,必须在每行四个正方形之一上向下移动。
但是,有一个特殊的规则,当一次降落一行时不能在同一行重复。
例如,
| 1 | 2 | 3 | 5 |
| 5 | 6 | 7 | 8 |
| 4 | 3 | 2 | 1 |
如果您已踩过1号线到4号线(5),则无法踩到4号线(8)的2号线。
我试图在Java中使用动态编程。
import java.lang.Math;
import java.util.*;
class Solution {
int [][] dp = new int[100001][4];
int solution(int[][] land) {
int r = land.length;
for (int i = 0; i < 4; i++)
{
dp[0][i] = land[0][i];
}
for (int i = 0; i <r; i++)
{
for (int j = 0; j < 4; ++j)
{
for(int k = 0; k < 4; ++k)
{
if (j != k)
{
dp[i][j] = Math.max(dp[i][j], land[i][j] + dp[i-1][k]);
}
}
}
}
int ans = 0;
for (int i = 0; i < 4; ++i)
{
ans = Math.max(ans, dp[r-1][i]);
}
return ans;
}
}
显示错误
java.lang.ArrayIndexOutOfBoundsException:-1
我当时认为条件语句可能有问题。
在C ++中,这些条件语句是正确的。运行完美。为什么在Java中出现错误? Java和C ++之间使用数组有什么区别吗?
能否请您告诉我如何解决此错误?
答案 0 :(得分:1)
dp[i-1][k]
-i
从上循环的零开始,因此该表达式的结果作为索引变为-1。
Java数组索引从零开始,而不是-1,这就是ArrayIndexOutOfBoundsException
的原因。
我不知道业务案例,但是解决此问题的一种方法是,首先从1而不是0开始for循环。