File tree Expand file tree Collapse file tree 2 files changed +40
-37
lines changed Expand file tree Collapse file tree 2 files changed +40
-37
lines changed Original file line number Diff line number Diff 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}
Original file line number Diff line number Diff 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 ,
You can’t perform that action at this time.
0 commit comments