Lintcode 116 Jump Game
动态规划组成部分一:确定状态
-
最后一步:如果青蛙能跳到最后一块石头n-1,我们考虑它跳的最后一步
-
这一步是从石头i跳过来的,i < n-1
-
这需要两个条件满足:
–青蛙可以跳到石头i
–最后一步不超过跳跃的最大距离: n − 1 − i ≤ a i n - 1 - i \leq a_i n−1−i≤ai
子问题
- 那么,我们需要知道青蛙能不能跳到石头i(i<n-1)
- 而我们原来要求青蛙能不能跳到石头n-1
- 子问题
动态规划组成部分二:转移方程
状态:设 f [ j ] f[j] f[j]表示青蛙能不能跳到石头j
动态规划组成部分三:初始条件和边界情况
- 设 f [ j ] f[j] f[j]表示青蛙能不能跳到石头j
- 初始条件: f [ 0 ] = f[0]= f[0]= True, 因为青蛙一开始就在石头0
动态规划组成部分四:计算顺序
- 设 f [ j ] f[j] f[j]表示青蛙能不能跳到石头j
- f [ j ] = O R 0 ≤ i < j ( f [ i ] A N D i + a [ i ] ≥ j ) f[j] = OR_ {0\leq i<j} (f[i] \space AND \space i+a[i]\geq j) f[j]=OR0≤i<j(f[i] AND i+a[i]≥j)
- 初始化 f [ 0 ] = T r u e f[0]=True f[0]=True
- 计算 f [ 1 ] , f [ 2 ] , . . . , f [ n − 1 ] f[1],f[2],...,f[n-1] f[1],f[2],...,f[n−1]
- 答案是 f [ n − 1 ] f[n-1] f[n−1]
- 时间复杂度: O ( N 2 ) O(N^2) O(N2)
- 空间复杂度(数组大小): O ( N ) O(N) O(N)
#代码
Java
题解
public class Solution{
public boolean canJump(int[] A) {
int n = A.length;
boolean[] f = new boolean[n];
f[0] = true;
for(int j = 1; j<n; ++j) {
f[j] = false;
// previous stone i
// last jump is from i to j
for (int i =0; i < j; ++j) {
if (int i = 0; i < j; ++i) {
f[j] = true;
break;
}
}
}
return f[n-1];
}
}
笔记内容出自视频:https://www.bilibili.com/video/BV1xb411e7ww?from=search&seid=6650948173443064939