Skip to content

Commit af631dd

Browse files
aQuaaQua
authored andcommitted
818 finish
1 parent b20012d commit af631dd

File tree

2 files changed

+40
-37
lines changed

2 files changed

+40
-37
lines changed

Algorithms/0818.race-car/race-car.go

Lines changed: 40 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,43 +4,51 @@ import (
44
"math"
55
)
66

7-
func racecar(target int) int {
8-
switch target {
9-
case 1:
10-
return 1
11-
case -1:
12-
return 2
13-
default:
14-
return helper(target, 0)
15-
}
16-
}
7+
var dp [10001]int
178

18-
func helper(target, pre int) int {
19-
switch target {
20-
case 0:
21-
return pre
22-
case 1:
23-
return pre + 1
9+
func racecar(t int) int {
10+
if dp[t] > 0 {
11+
return dp[t]
2412
}
2513

26-
s := step(target)
27-
28-
n := nextTarget(target, s)
29-
30-
if n < 0 {
31-
pre += s + 1
32-
return helper(-n, pre)
14+
// 2^(n-1) <= target < 2^n
15+
n := uint(math.Log2(float64(t))) + 1
16+
17+
if t == 1<<n-1 {
18+
// n 个 A,就可以正好走到 t
19+
dp[t] = int(n)
20+
} else {
21+
// 一开始就 n 个 A,距离 (1<<n-1) > t 的情况
22+
dp[t] = racecar(1<<n-1-t) + int(n) + 1
23+
// ^ ^ ^
24+
// | | |
25+
// | | 转向 R
26+
// | n 个 A, 到达 1<<n-1 需要的步骤数目
27+
// 走完剩下距离的最优解
28+
29+
for m := uint(0); m < n-1; m++ {
30+
// 一开始就连续 (n-1) 个 A,到达 1<<(n-1)-1
31+
// 转向 R
32+
// 连续 m 个 A,到达 1<<(n-1) - 1 - (1<<m - 1) = 1<<(n-1) - 1<<m
33+
// 再一次转向 R,如果不转向的话,就是背朝着 target 了
34+
dp[t] = min(dp[t], racecar(t-1<<(n-1)+1<<m)+int(n-1)+1+int(m)+1)
35+
// ^ ^ ^ ^ ^
36+
// | | | | |
37+
// | | | | 转向 R
38+
// | | | m 个 A
39+
// | | 转向 R
40+
// | n-1 个 A
41+
// 走完剩下的距离的最优解
42+
43+
}
3344
}
34-
pre += s + 2
35-
return helper(n, pre)
3645

46+
return dp[t]
3747
}
3848

39-
func step(target int) int {
40-
return int(math.Log2(float64(target))*2+1) / 2
41-
}
42-
43-
func nextTarget(target, step int) int {
44-
return target -
45-
(int(math.Pow(2, float64(step))) - 1)
49+
func min(a, b int) int {
50+
if a < b {
51+
return a
52+
}
53+
return b
4654
}

Algorithms/0818.race-car/race-car_test.go

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,6 @@ var tcs = []struct {
8888
4,
8989
},
9090

91-
{
92-
-1,
93-
2,
94-
},
95-
9691
{
9792
1,
9893
1,

0 commit comments

Comments
 (0)