Advertisement
goodwish

Hard 622. Frog Jump

Oct 29th, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.30 KB | None | 0 0
  1. way 1: DP, 坐标+状态 型动态规划.
  2. 先找到变化的维度或数据, i.e. 状态 = 步长 j, 0 < j < i + 1; n 个石头, 每次步长加一, 最大跳 n 单元.
  3. 再简化可以推导出的维度.
  4.  
  5. 数据结构: v_idx = {v:i for i, v in enumerate(A)} 反向索引, {val : index}
  6.  
  7. 子问题: f[i][j], 跳到 stones[i] 需要 j 步.
  8. 方程: f[i][j] = f[k][j] or f[k][j + 1] or f[k][j - 1]. k = val_idx[A[i] - j], 如果 A[k] 存在.
  9. init: f[0][0] = f[1][1] = True
  10. 计算顺序:
  11. for i in range(2, n):
  12.   for j in range(i + 1):
  13.      f[i][j] = ..;
  14.  
  15. way 2: DP + hashmap set
  16.  
  17. <code 1>
  18. class Solution:
  19.     def canCross(self, stones):
  20.         # init
  21.         A = stones
  22.         n = len(A)
  23.         if n < 2:
  24.             return True
  25.         if A[1] != 1:
  26.             return False
  27.         v_idx = {v:i for i, v in enumerate(A)}
  28.         f = [[False] * (n + 2) for _ in range(n)]
  29.         f[0][0] = f[1][1] = True
  30.        
  31.         for i in range(2, n):
  32.             for j in range(i):
  33.                 kv = A[i] - j
  34.                 if kv not in v_idx:
  35.                     continue
  36.                 k = v_idx[kv]
  37.                 if f[k][j] or f[k][j + 1] or f[k][j - 1]:
  38.                     f[i][j] = True
  39.        
  40.         ans = any(f[n - 1])
  41.         return ans
  42.  
  43. stones = [0,1,3,5,6,8,12,17]
  44. # True
  45. ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement