leetcode/
minimum_path_sum.rs1pub struct Solution;
36
37impl Solution {
38 pub fn min_path_sum(grid: Vec<Vec<i32>>) -> i32 {
39 assert!(grid.len() >= 1 && grid.len() <= 200);
40 assert!(grid[0].len() >= 1 && grid[0].len() <= 200);
41
42 grid.iter().fold(None::<Vec<i32>>, |last_row, row| {
43 row.iter().enumerate().scan(None, |left, (i, &v)| {
44 assert!(v >= 0 && v <= 100); *left = match (&left, &last_row) {
46 (None, None) => v, (Some(left), None) => left + v, (None, Some(last_row)) => last_row[i] + v, (Some(left), Some(last_row)) => std::cmp::min(*left, last_row[i]) + v,
50 }.into();
51 *left
52 }).collect::<Vec<_>>().into()
53 }).unwrap().pop().unwrap()
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 use super::*;
60
61 #[test]
62 fn test() {
63 let cases = vec![
64 (7, vec![vec![1,3,1],vec![1,5,1],vec![4,2,1]]),
65 (12, vec![vec![1,2,3],vec![4,5,6]]),
66 (14, vec![vec![1,3,4,8], vec![3,2,2,4], vec![5,7,1,9], vec![2,3,2,3]]),
67 ];
68
69 for (expect, input) in cases {
70 assert_eq!(expect, Solution::min_path_sum(input));
71 }
72 }
73}