1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
use std::collections::HashMap;
impl Solution {
pub fn max_operations(nums: Vec<i32>) -> i32 {
let n = nums.len();
if n < 2 {
return 0;
}
let mut memo = HashMap::new();
fn dfs(
l: usize,
r: usize,
score: i32,
nums: &Vec<i32>,
memo: &mut HashMap<String, i32>,
) -> i32 {
if r < l || r - l + 1 < 2 {
return 0;
}
let key = format!("{},{},{}", l, r, score);
if let Some(&val) = memo.get(&key) {
return val;
}
let mut res = 0;
// Try removing first two elements
if l + 1 <= r && nums[l] + nums[l + 1] == score {
res = res.max(1 + dfs(l + 2, r, score, nums, memo));
}
// Try removing last two elements
if r >= 1 && r - 1 >= l && nums[r] + nums[r - 1] == score {
res = res.max(1 + dfs(l, r - 2, score, nums, memo));
}
// Try removing first and last elements
if l < r && nums[l] + nums[r] == score {
res = res.max(1 + dfs(l + 1, r - 1, score, nums, memo));
}
memo.insert(key, res);
res
}
let mut ans = 0;
// Try all three possible first operations
ans = ans.max(1 + dfs(2, n - 1, nums[0] + nums[1], &nums, &mut memo)); // Remove first two
ans = ans.max(1 + dfs(0, n - 3, nums[n - 1] + nums[n - 2], &nums, &mut memo)); // Remove last two
ans = ans.max(1 + dfs(1, n - 2, nums[0] + nums[n - 1], &nums, &mut memo)); // Remove first and last
ans
}
}
|