Skip to content

Commit ad9c6d3

Browse files
authored
fix: update rust solution to lc problem: No.2742 (doocs#1209)
1 parent 06309e7 commit ad9c6d3

File tree

3 files changed

+73
-90
lines changed

3 files changed

+73
-90
lines changed

solution/2700-2799/2742.Painting the Walls/README.md

Lines changed: 24 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -181,47 +181,33 @@ func min(a, b int) int {
181181

182182
```rust
183183
impl Solution {
184-
pub fn distance_traveled(mut main_tank: i32, mut additional_tank: i32) -> i32 {
185-
let mut cur = 0;
186-
let mut ans = 0;
187-
188-
while main_tank > 0 {
189-
cur += 1;
190-
main_tank -= 1;
191-
ans += 10;
192-
193-
if cur % 5 == 0 && additional_tank > 0 {
194-
additional_tank -= 1;
195-
main_tank += 1;
196-
}
197-
}
198-
199-
ans
184+
#[allow(dead_code)]
185+
pub fn paint_walls(cost: Vec<i32>, time: Vec<i32>) -> i32 {
186+
let n = cost.len();
187+
let mut record_vec: Vec<Vec<i32>> = vec![vec![-1; n << 1 | 1]; n];
188+
Self::dfs(&mut record_vec, 0, n as i32, n as i32, &time, &cost)
200189
}
201-
}
202-
```
203190

204-
```rust
205-
impl Solution {
206-
pub fn distance_traveled(mut main_tank: i32, mut additional_tank: i32) -> i32 {
207-
let mut ans = 0;
208-
209-
while main_tank > 0 {
210-
if main_tank >= 5 {
211-
ans += 50;
212-
main_tank -= 5;
213-
214-
if additional_tank > 0 {
215-
additional_tank -= 1;
216-
main_tank += 1;
217-
}
218-
} else {
219-
ans += main_tank * 10;
220-
main_tank = 0;
221-
}
191+
#[allow(dead_code)]
192+
fn dfs(record_vec: &mut Vec<Vec<i32>>, i: i32, j: i32, n: i32, time: &Vec<i32>, cost: &Vec<i32>) -> i32 {
193+
if n - i <= j - n {
194+
// All the remaining walls can be printed at no cost
195+
// Just return 0
196+
return 0;
222197
}
223-
224-
ans
198+
if i >= n {
199+
// No way this case can be achieved
200+
// Just return +INF
201+
return 1 << 30;
202+
}
203+
if record_vec[i as usize][j as usize] == -1 {
204+
// This record hasn't been written
205+
record_vec[i as usize][j as usize] = std::cmp::min(
206+
Self::dfs(record_vec, i + 1, j + time[i as usize], n, time, cost) + cost[i as usize],
207+
Self::dfs(record_vec, i + 1, j - 1, n, time, cost)
208+
);
209+
}
210+
record_vec[i as usize][j as usize]
225211
}
226212
}
227213
```

solution/2700-2799/2742.Painting the Walls/README_EN.md

Lines changed: 24 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -159,47 +159,33 @@ func min(a, b int) int {
159159

160160
```rust
161161
impl Solution {
162-
pub fn distance_traveled(mut main_tank: i32, mut additional_tank: i32) -> i32 {
163-
let mut cur = 0;
164-
let mut ans = 0;
165-
166-
while main_tank > 0 {
167-
cur += 1;
168-
main_tank -= 1;
169-
ans += 10;
170-
171-
if cur % 5 == 0 && additional_tank > 0 {
172-
additional_tank -= 1;
173-
main_tank += 1;
174-
}
175-
}
176-
177-
ans
162+
#[allow(dead_code)]
163+
pub fn paint_walls(cost: Vec<i32>, time: Vec<i32>) -> i32 {
164+
let n = cost.len();
165+
let mut record_vec: Vec<Vec<i32>> = vec![vec![-1; n << 1 | 1]; n];
166+
Self::dfs(&mut record_vec, 0, n as i32, n as i32, &time, &cost)
178167
}
179-
}
180-
```
181168

182-
```rust
183-
impl Solution {
184-
pub fn distance_traveled(mut main_tank: i32, mut additional_tank: i32) -> i32 {
185-
let mut ans = 0;
186-
187-
while main_tank > 0 {
188-
if main_tank >= 5 {
189-
ans += 50;
190-
main_tank -= 5;
191-
192-
if additional_tank > 0 {
193-
additional_tank -= 1;
194-
main_tank += 1;
195-
}
196-
} else {
197-
ans += main_tank * 10;
198-
main_tank = 0;
199-
}
169+
#[allow(dead_code)]
170+
fn dfs(record_vec: &mut Vec<Vec<i32>>, i: i32, j: i32, n: i32, time: &Vec<i32>, cost: &Vec<i32>) -> i32 {
171+
if n - i <= j - n {
172+
// All the remaining walls can be printed at no cost
173+
// Just return 0
174+
return 0;
200175
}
201-
202-
ans
176+
if i >= n {
177+
// No way this case can be achieved
178+
// Just return +INF
179+
return 1 << 30;
180+
}
181+
if record_vec[i as usize][j as usize] == -1 {
182+
// This record hasn't been written
183+
record_vec[i as usize][j as usize] = std::cmp::min(
184+
Self::dfs(record_vec, i + 1, j + time[i as usize], n, time, cost) + cost[i as usize],
185+
Self::dfs(record_vec, i + 1, j - 1, n, time, cost)
186+
);
187+
}
188+
record_vec[i as usize][j as usize]
203189
}
204190
}
205191
```
Lines changed: 25 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,30 @@
11
impl Solution {
2-
pub fn distance_traveled(mut main_tank: i32, mut additional_tank: i32) -> i32 {
3-
let mut cur = 0;
4-
let mut ans = 0;
5-
6-
while main_tank > 0 {
7-
cur += 1;
8-
main_tank -= 1;
9-
ans += 10;
2+
#[allow(dead_code)]
3+
pub fn paint_walls(cost: Vec<i32>, time: Vec<i32>) -> i32 {
4+
let n = cost.len();
5+
let mut record_vec: Vec<Vec<i32>> = vec![vec![-1; n << 1 | 1]; n];
6+
Self::dfs(&mut record_vec, 0, n as i32, n as i32, &time, &cost)
7+
}
108

11-
if cur % 5 == 0 && additional_tank > 0 {
12-
additional_tank -= 1;
13-
main_tank += 1;
14-
}
9+
#[allow(dead_code)]
10+
fn dfs(record_vec: &mut Vec<Vec<i32>>, i: i32, j: i32, n: i32, time: &Vec<i32>, cost: &Vec<i32>) -> i32 {
11+
if n - i <= j - n {
12+
// All the remaining walls can be printed at no cost
13+
// Just return 0
14+
return 0;
1515
}
16-
17-
ans
16+
if i >= n {
17+
// No way this case can be achieved
18+
// Just return +INF
19+
return 1 << 30;
20+
}
21+
if record_vec[i as usize][j as usize] == -1 {
22+
// This record hasn't been written
23+
record_vec[i as usize][j as usize] = std::cmp::min(
24+
Self::dfs(record_vec, i + 1, j + time[i as usize], n, time, cost) + cost[i as usize],
25+
Self::dfs(record_vec, i + 1, j - 1, n, time, cost)
26+
);
27+
}
28+
record_vec[i as usize][j as usize]
1829
}
1930
}

0 commit comments

Comments
 (0)