Advertisement
Guest User

minStep

a guest
Oct 24th, 2019
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.03 KB | None | 0 0
  1. 有n层楼梯,每次可以爬1~2步,问能爬的最少的能整除 m 的步数是多少? n <= 10000, m < 20.
  2.  
  3. 请问怎么把下边的  DFS + Memoization 转换成 DP 数组递推?
  4.  
  5. class Solution:
  6.     def minStep(self, n, m):
  7.         if n < m:
  8.             return -1
  9.         # DFS + memoization,
  10.         f = [[-1] * (n + 1) for _ in range(n + 1)]
  11.         ans = self.dfs(n, m, 0, f)
  12.         if ans == float("inf"):
  13.             return -1
  14.         return ans
  15.  
  16.     def dfs(self, n, m, steps, f):
  17.         if n < 0:
  18.             return float("inf")
  19.         if n == 0:
  20.             if steps % m == 0:
  21.                 f[n][steps] = steps
  22.                 return steps
  23.             return float("inf")
  24.         if f[n][steps] != -1:
  25.             return f[n][steps]
  26.         ans = float("inf")
  27.         ans = min(ans, self.dfs(n - 1, m, steps + 1, f))
  28.         ans = min(ans, self.dfs(n - 2, m, steps + 1, f))
  29.         f[n][steps] = ans
  30.         return ans
  31.  
  32.  
  33. n, m = 271, 5
  34. n, m = 10, 2
  35. o = Solution()
  36. ans = o.minStep(n, m)
  37. print(ans)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement