Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Matrix-chain Multiplication

The goal of the matrix-chain multiplication problem is to find the most efficient way to multiply given $n$ matrices $M_1, M_2, M_3,...,M_n$.

Write a program which reads dimensions of $M_i$, and finds the minimum number of scalar multiplications to compute the maxrix-chain multiplication $M_1M_2...M_n$.

Input

In the first line, an integer $n$ is given. In the following $n$ lines, the dimension of matrix $M_i$ ($i = 1...n$) is given by two integers $r$ and $c$ which respectively represents the number of rows and columns of $M_i$.

Output

Print the minimum number of scalar multiplication in a line.

Constraints

$1 \leq n \leq 100$

$1 \leq r, c \leq 100$

Sample Input 1

6
30 35
35 15
15 5
5 10
10 20
20 25

Sample Output 1

15125

Solution in C# (judge verdict: Accepted)

using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;
 
class Program
{
    static int[] dimention;
    static int[,] numOfMulti;
    static void Main()
    {
        int n = int.Parse(Console.ReadLine());
        dimention = new int[n + 1];
        numOfMulti = new int[n, n];
        for (int i = 0; i < n; i++)
        {
            int[] inputs = Console.ReadLine().Split(' ')
                                        .Select(val => int.Parse(val))
                                        .ToArray();
            if(i == 0) dimention[0] = inputs.First();
            dimention[i + 1] = inputs.Last();
        }
        //Console.Error.WriteLine(string.Join(" ", dimention));
        Console.WriteLine(NumberOfMultiplication(0, n - 1));
    }

    
    static int NumberOfMultiplication(int i, int j)
    {
        //Console.Error.Write("i = {0}, j = {1}: ", i, j);
        if(i == j) return 0;
        if(numOfMulti[i, j] != 0) return numOfMulti[i, j];
        if(i + 1 == j) return numOfMulti[i, j] = dimention[i] * dimention[j] * dimention[j + 1];
        numOfMulti[i, j] = Enumerable.Range(i, j - i)
                                            .Select(k => NumberOfMultiplication(i, k) 
                                              + NumberOfMultiplication(k + 1, j) 
                                              + dimention[i] * dimention[k + 1] * dimention[j + 1])
                                            .Min();
        //Console.WriteLine("numOfMulti[{0}, {1}] = {2}", i, j, numOfMulti[i, j]);
        return numOfMulti[i, j];
    }
}