public class JumpGame {
public static boolean jg(int[] arr) {
if (arr == null || arr.length == 0) {
return false;
}
boolean dp[][] = new boolean[arr.length+1][arr.length+1];
for (int j = 1; j <= arr.length; j++) {
// distance
int i = arr[j-1];
while (i > 0) {
dp[j][i--] = true;
}
}
for (int i = 2; i <= arr.length; i++) {
for (int j = 1; j+i <= arr.length; j++) {
if (!dp[j][i]) {
for (int k = 1; k < i; k++) {
if (dp[j][k] && dp[j+k][i-k]) {
dp[j][i] = true;
break;
}
}
}
}
}
return dp[1][arr.length-1];
}
public static void main(String[] args) {
System.out.println(jg(new int[]{2,3,1,1,4}));
System.out.println(jg(new int[]{3,2,1,0,4}));
}
}解题思路:
构造dp数组,dp[j][i]表示第j个元素能否跳到j+i个元素
一步到达:遍历输入数组arr, 标记j位置后距离i=1~arr[j-1]个位置可达, 即 dp[j][i] = true
多步到达:将距离i拆分为2段,左边距离k,右边i-1, 距离i可达的问题转换为了i位置k距离可达,和 j+k位置i-k距离可达, 即 dp[i][j] = dp[j][k] && dp[j+k][i-k]。 由于是递增计算距离i是否可达,所以在计算 dp[i][j] 时, dp[j][k] 和 dp[j+k][i-k] 已经计算过。
本文介绍了使用动态规划解决Jump Game问题的方法。通过构造dp数组,dp[j][i]表示数组中第j个元素能否跳到j+i的位置。首先,遍历数组设置一步到达的情况,然后递增计算多步到达的可能性,即dp[i][j] = dp[j][k] && dp[j+k][i-k]。
3046

被折叠的 条评论
为什么被折叠?



