此代码来自LeetCode问题“ Frog Jump”的解决方案:
public class Solution {
public boolean canCross(int[] stones) {
int[][] memo = new int[stones.length][stones.length];
for (int[] row : memo) {
Arrays.fill(row, -1);
}
return can_Cross(stones, 0, 0, memo) == 1;
}
public int can_Cross(int[] stones, int ind, int jumpsize, int[][] memo) {
if (memo[ind][jumpsize] >= 0) {
return memo[ind][jumpsize];
}
for (int i = ind + 1; i < stones.length; i++) {
int gap = stones[i] - stones[ind];
if (gap >= jumpsize - 1 && gap <= jumpsize + 1) {
if (can_Cross(stones, i, gap, memo) == 1) {
memo[ind][gap] = 1;
return 1;
}
}
}
memo[ind][jumpsize] = (ind == stones.length - 1) ? 1 : 0;
return memo[ind][jumpsize];
}
}
问题的说明:
一只青蛙过河。河流分为x个单位,在 每个单元可能存在或可能不存在石头。青蛙可以跳上 石头,但绝对不能跳入水中。
给出以升序排列的宝石位置列表(单位) 命令,确定青蛙是否能够通过降落在河上 最后一块石头。最初,青蛙在第一块石头上,并假设 第一跳必须为1个单位。
如果青蛙的最后一次跳跃是k个单位,则它的下一次跳跃必须是 k-1,k或k + 1个单位。请注意,青蛙只能跳入 向前的方向。
注意:
结石数量≥2并且<1,100。每块石头的位置 是小于231的非负整数。第一块宝石的位置始终是 0.示例1:
[0,1,3,5,6,8,12,17]
共有8块石头。第一块石头在第0个单位,第二个 第一单元的石头,第三单元的第三石头,依此类推... 在第十七单位的最后一块石头。
返回true。青蛙可以通过跳1个单位跳到最后一块石头 第二块石头,然后是2个单位到第三块石头,然后是2个单位到第四块 石头,然后是3个单位到6号石头,4个单位到7号石头和5个石头 单位到第八石。示例2:
[0,1,2,3,4,8,9,11]
返回false。没有办法跳到最后一块石头 第5和第6石头之间的距离太大。