use crate::Solution;
problem!(Problem0082, 82, "Path Sum: Three Ways");
impl Solution for Problem0082 {
fn solve(&self) -> String {
const INPUT: &str = include_str!("0082_matrix.txt");
let input_matrix = INPUT
.trim()
.lines()
.map(|line| {
line.trim()
.split(',')
.map(|num_str| num_str.parse::<u32>().unwrap())
.collect::<Vec<u32>>()
})
.collect::<Vec<Vec<u32>>>();
let mut work_matrix = input_matrix.clone();
for j in (0..(work_matrix[0].len() - 1)).rev() {
for i in 0..work_matrix.len() {
let mut min_sum = work_matrix[i][j + 1];
let mut up_sum = 0;
for k in (0..i).rev() {
up_sum += input_matrix[k][j];
if up_sum > min_sum {
break;
}
let candidate_min_sum = up_sum + work_matrix[k][j + 1];
if candidate_min_sum < min_sum {
min_sum = candidate_min_sum;
}
}
let mut down_sum = 0;
for k in (i + 1)..work_matrix.len() {
down_sum += input_matrix[k][j];
if down_sum > min_sum {
break;
}
let candidate_min_sum = down_sum + work_matrix[k][j + 1];
if candidate_min_sum < min_sum {
min_sum = candidate_min_sum;
}
}
work_matrix[i][j] += min_sum;
}
}
work_matrix
.into_iter()
.map(|row| row[0]) .min()
.unwrap()
.to_string()
}
}