diff --git a/src/solutions/maximum_path_sum_i.rs b/src/solutions/maximum_path_sum_i.rs index 611fd86..409bc1c 100644 --- a/src/solutions/maximum_path_sum_i.rs +++ b/src/solutions/maximum_path_sum_i.rs @@ -14,7 +14,6 @@ pub fn solve() -> i64 { triangle[row][col] += std::cmp::max(triangle[row + 1][col], triangle[row + 1][col + 1]); } } - let result = triangle[0][0]; assert_eq!(result, 1074); diff --git a/src/solutions/maximum_path_sum_ii.rs b/src/solutions/maximum_path_sum_ii.rs index dcea20f..876bc28 100644 --- a/src/solutions/maximum_path_sum_ii.rs +++ b/src/solutions/maximum_path_sum_ii.rs @@ -1,50 +1,20 @@ use std::io::BufRead; -struct CacheMap { - map: std::collections::HashMap<(usize, usize), i32>, - triangle: Vec>, -} -impl CacheMap { - fn new(triangle: Vec>) -> CacheMap { - CacheMap { - map: std::collections::HashMap::new(), - triangle, - } - } - /// Find the maximum path sum to the bottom, starting from the given row - /// and column indices. - /// - /// * `key` - Tuple of row and column indices. - /// - /// -> Maximum path sum. - fn get(&mut self, key: (usize, usize)) -> i32 { - let (row, col) = key; - if row >= self.triangle.len() { - return 0; - } - match self.map.get(&key) { - Some(&value) => value, - None => { - let left = self.get((row + 1, col)); - let right = self.get((row + 1, col + 1)); - let value = self.triangle[row][col] + std::cmp::max(left, right); - self.map.insert(key, value); - value - } - } - } -} - pub fn solve() -> i64 { let fhandle = std::fs::File::open("res/maximum_path_sum_ii.txt").unwrap(); let reader = std::io::BufReader::new(fhandle); - let triangle: Vec> = reader + let mut triangle: Vec> = reader .lines() .map(|line| line.unwrap().split(' ').map(|s| s.parse().unwrap()).collect()) .collect(); - let mut cache_map = CacheMap::new(triangle); - let result = cache_map.get((0, 0)); + // Bottom-up dynamic programming. + for row in (0..triangle.len()).rev().skip(1) { + for col in 0..triangle[row].len() { + triangle[row][col] += std::cmp::max(triangle[row + 1][col], triangle[row + 1][col + 1]); + } + } + let result = triangle[0][0]; assert_eq!(result, 7273); result as i64