dp
array
]
Leetcode 1575. Count All Possible Routes
Problem statement
https://leetcode.com/problems/count-all-possible-routes/
Solution
Let dp(last, F)
be number of ways to go from start to last
location such that we have F
fuel when we arrived. Then we can check all possible dp(finish, 0), ..., dp(finish, fuel - 1)
and choose the best one.
Complexity
Time complexity O(n^2*fuel)
, space complexity is O(n*fuel)
.
Code
class Solution:
def countRoutes(self, L, start, finish, fuel):
n, M = len(L), 10**9 + 7
@lru_cache(None)
def dp(last, F):
if F > fuel: return 0
if fuel == F: return last == start
return sum(dp(i, F + abs(L[i] - L[last])) for i in range(n) if i != last) % M
return (sum(dp(finish, i) for i in range(fuel)) + (start == finish)) % M
Remark
There is also in fact O(n*fuel)
complexity solution, if we use the fact that we live on the line: let rdp(j, f)
be number of ways to go from start to j
with f
fuel left, such that the last move was made to the left. Similarly, define ldp(j, f)
. Then we can write the following equations:
ldp(j, f) = rdp(j + 1, f - d(j, j+1)) + 2*ldp(j + 1, f - d(j, j+1))
rdp(j, f) = ldp(j - 1, f - d(j, j-1)) + 2*rdp(j - 1, f - d(j, j-1))
,
where d(j, j+1)
is distance between cities j
and j + 1
(we need to sort them in advance). Also we need to deal with some border cases.