use std::cmp; #[derive(Debug)] struct Question { answered: i64, skipped: i64, } impl Question { fn get_with_offset(stack: &Vec, offset: i64) -> i64 { let i = stack.len() as i64 - offset - 1; if i < 0 || i >= stack.len() as i64 { return 0; } stack[i as usize].get() } pub fn new(q: &[i32], stack: &Vec) -> Self { Self { answered: q[0] as i64 + Self::get_with_offset(stack, q[1].into()), skipped: Self::get_with_offset(stack, 0), } } pub fn get(&self) -> i64 { cmp::max(self.answered, self.skipped) } } struct Solution {} impl Solution { pub fn most_points(questions: Vec>) -> i64 { let mut stack: Vec = vec![]; for input_q in questions.iter().rev() { stack.push(Question::new(&input_q, &stack)); } stack.last().unwrap().get() } } fn main() {} #[cfg(test)] mod tests { use super::*; #[test] fn test_example_1() { assert_eq!( Solution::most_points(vec![vec![3, 2], vec![4, 3], vec![4, 4], vec![2, 5]]), 5 ); } #[test] fn test_example_2() { assert_eq!( Solution::most_points(vec![ vec![1, 1], vec![2, 2], vec![3, 3], vec![4, 4], vec![5, 5] ]), 7 ); } }