Skip to content

Commit 64e8bfe

Browse files
committed
dp
1 parent 97955e1 commit 64e8bfe

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

403 Frog Jump.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
"""
2+
A frog is crossing a river. The river is divided into x units and at each unit there may or may not exist a stone. The
3+
frog can jump on a stone, but it must not jump into the water.
4+
5+
Given a list of stones' positions (in units) in sorted ascending order, determine if the frog is able to cross the river
6+
by landing on the last stone. Initially, the frog is on the first stone and assume the first jump must be 1 unit.
7+
8+
If the frog's last jump was k units, then its next jump must be either k - 1, k, or k + 1 units. Note that the frog can
9+
only jump in the forward direction.
10+
11+
Note:
12+
13+
The number of stones is >= 2 and is < 1,100.
14+
Each stone's position will be a non-negative integer < 231.
15+
The first stone's position is always 0.
16+
Example 1:
17+
18+
[0,1,3,5,6,8,12,17]
19+
20+
There are a total of 8 stones.
21+
The first stone at the 0th unit, second stone at the 1st unit,
22+
third stone at the 3rd unit, and so on...
23+
The last stone at the 17th unit.
24+
25+
Return true. The frog can jump to the last stone by jumping
26+
1 unit to the 2nd stone, then 2 units to the 3rd stone, then
27+
2 units to the 4th stone, then 3 units to the 6th stone,
28+
4 units to the 7th stone, and 5 units to the 8th stone.
29+
Example 2:
30+
31+
[0,1,2,3,4,8,9,11]
32+
33+
Return false. There is no way to jump to the last stone as
34+
the gap between the 5th and 6th stone is too large.
35+
"""
36+
__author__ = 'Daniel'
37+
38+
39+
class Solution(object):
40+
def canCross(self, stones):
41+
"""
42+
F, step table
43+
Let F[i] be stone at position i,
44+
45+
dp with a set as the table cell.
46+
:type stones: List[int]
47+
:rtype: bool
48+
"""
49+
F = {}
50+
for stone in stones:
51+
F[stone] = set()
52+
53+
F[0].add(0)
54+
for stone in stones:
55+
for step in F[stone]:
56+
for i in (-1, 0, 1):
57+
nxt = stone+step+i
58+
if nxt != stone and nxt in F:
59+
F[nxt].add(step+i)
60+
61+
return True if F[stones[-1]] else False
62+
63+
64+
if __name__ == "__main__":
65+
assert Solution().canCross([0, 2]) == False
66+
assert Solution().canCross([0, 1, 3, 5, 6, 8, 12, 17]) == True
67+
assert Solution().canCross([0, 1, 2, 3, 4, 8, 9, 11]) == False

0 commit comments

Comments
 (0)