use std::io::stdin; fn split_by_2(s: &str) -> (usize, usize) { let mut iter = s.split_ascii_whitespace(); ( iter.next().unwrap().parse().unwrap(), iter.next().unwrap().parse().unwrap(), ) } fn get_mult_count(mat1: &(usize, usize), mat2: &(usize, usize)) -> usize { // ensure that m1.c == m2.r mat1.0 * mat1.1 * mat2.1 } fn get_mat(mats: &Vec<(usize, usize)>, from: usize, to: usize) -> (usize, usize) { (mats[from].0, mats[to].1) } fn get_minimum_mult_count(n: usize, mats: Vec<(usize, usize)>) -> usize { let mut dp: Vec> = vec![vec![0; n]; n]; for interval in 1..n { for i in 0..n - interval { dp[i][i + interval] = *(0..interval) .map(|split| { dp[i][i + split] + dp[i + split + 1][i + interval] + get_mult_count( &get_mat(&mats, i, i + split), &get_mat(&mats, i + split + 1, i + interval), ) }) .collect::>() .iter() .min() .unwrap(); } } dp[0][n - 1] } fn main() { let mut line = String::new(); stdin().read_line(&mut line).unwrap(); let n: usize = line.trim().parse().unwrap(); let mats: Vec<(usize, usize)> = (0..n) .map(|_| { let mut line = String::new(); stdin().read_line(&mut line).unwrap(); split_by_2(&line) }) .collect(); println!("{}", get_minimum_mult_count(n, mats)); }