Go: package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

//util
var sc = bufio.NewScanner(os.Stdin)

func nextStr() string {
	sc.Scan()
	return sc.Text()
}

func nextInt() int {
	sc.Scan()
	i, e := strconv.Atoi(sc.Text())
	if e != nil {
		panic(e)
	}
	return i
}

func printList(list []int) {
	buf := bufio.NewWriter(os.Stdout)
	for _, v := range list {
		buf.Write([]byte(fmt.Sprintf(" %d", v)))
	}
	buf.Write([]byte("\n"))
	buf.Flush()
}

//solve
//単純な場合
func matrixChainMultiplication() {
	//行列が1つだけのとき
	for i := 1; i <= n; i++ {
		m[i][i] = 0
	}
	for l := 2; l <= n; l++ {
		for i := 1; i <= n-l+1; i++ {
			j := i + l - 1
			m[i][j] = 1 << 21
			//kまでで区切る
			for k := i; k <= j-1; k++ {
				m[i][j] = min(m[i][j], m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j])
			}
		}
	}
}

func max(a, b int) int {
	if a > b {
		return a
	} else {
		return b
	}
}

func min(a, b int) int {
	if a > b {
		return b
	} else {
		return a
	}
}

const MAX = 100

var n int
var p [MAX + 1]int

//m[i][j]: Mi * Mi+1 * ... * Mjを計算するときに必要なスカラー乗算の最小回数
var m [MAX + 1][MAX + 1]int

func main() {
	sc.Split(bufio.ScanWords)
	n = nextInt()
	for i := 1; i <= n; i++ {

		p[i-1] = nextInt() //行数
		p[i] = nextInt()   //列数
	}

	matrixChainMultiplication()
	fmt.Println(m[1][n])
}

Python: def s():
 n=int(input())+1
 e=[input().split()for _  in[0]*~-n]
 p=[int(e[0][0])]+list(int(x[1])for x in e)
 m=[[0]*n for _ in[0]*n]
 for i in range(n):
  for r in range(n-i-1):
   c=r+i+1
   for j in range(r+1,c):
    x=m[r][j]+m[j][c]+p[r]*p[j]*p[c]
    if not 0<m[r][c]<=x:m[r][c]=x
 print(m[r][c])
if'__main__'==__name__:s()

Python: import sys
INFTY=sys.maxsize

def main(n,m,p):
    #global m
    #global p

    for i in range(1,n+1):
        m[i][i]=0

    for l in range(1,n):
        for i in range(1,n-l+1):
            j=i+l
            m[i][j]=INFTY
            for k in range(i,j):
                m[i][j] = min(m[i][j], m[i][k] + m[k+1][j]+p[i-1]*p[k]*p[j])    
    print(m[1][n])


n=int(input())
p=[]
k,l=list(map(int,input().split()))
i=1
p.append(k)
p.append(l)
while(i<n):
    l,m=list(map(int,input().split()))
    p.append(m)
    i+=1

m=[]
for i in range(n+1):
    mm=[0]*(n+1)
    m.append(mm)

main(n,m,p)

Python: n = int(input())
rc = [list(map(int, input().split())) for _ in range(n)]
rc_min = rc.index(min(rc))

def calc(rc):
    total = 0
    for i, irc in enumerate(rc):
        if i ==0:
            r, c = irc
        else:
            total += r * c * irc[1]
            c = irc[1]
    return r, c, total
def reverse_calc(rc):
    total = 0
    for i, irc in enumerate(rc[::-1]):
        if i ==0:
            r, c = irc
        else:
            total += r * c * irc[0]
            r = irc[0]
    return r, c, total

former = rc[:rc_min]
latter = rc[rc_min:]
total=r1=c1=r2=c2 =0
if former:
    r1, c1, ret = reverse_calc(rc[:rc_min])
    total += ret
if latter:
    r2, c2, ret =calc(rc[rc_min:])
    total += ret
if former and latter:
    total += r1 * c1 * c2
print(total)

Python: import sys

N = 100
n = int(input())

p = [0]*(N+1)
m = [list([0]*(N+1)) for _ in range(N+1)]

for i in range(n):
    p[i],p[i+1]=map(int,input().split())
for l in range(2,n+1):
    for i in range(1,n-l+2):
        j = i+l-1
        m[i][j]=sys.maxsize
        for k in range(i,j):
            m[i][j] = min(m[i][j],m[i][k] + m[k+1][j] + p[i-1] *p[k]*p[j])

print(m[1][n])

Python: n = int(input())
r = [0]*n
c = [0]*n
for i in range(n):
    r[i], c[i] = map(int, input().split())


# T[i][j]  stands for the minimum number of product operation (of real numbers)
# that has to be performed in calculating 
# the matrix chain product $M_i \times \dots \times M_j$
T = [[0]*n for _ in range(n)]

# p = j -i
for p in range(1, n):
    for i in range(n-p):
        j = i + p
        val = float("inf")
        for k in range(i,j):
            val_tmp = T[i][k] + T[k+1][j] + r[i]*c[k]*c[j]
            if val_tmp < val:
                val = val_tmp
        T[i][j] = val
        
print(T[0][n-1])

Python: N = int(input())
RC = []
for _ in range(N):
    RC.append(list(map(int, input().split())))

dp = {}

for i in range(N):
    dp[(i, i)] = 0

for w in range(2, N+1):
    for l in range(N-w+1):
        cost = float('inf')
        r = l+w-1
        for m in range(l, r):
            mul = RC[l][0] * RC[m][1] * RC[r][1]
            cost = min(cost, dp[(l, m)]+dp[(m+1,r)] + mul)
        dp[(l, r)] = cost
print(dp[(0, N-1)])

Python: INF = float('inf')


def main():
    n = int(input())
    p = [0 for _ in range(n+1)]

    for i in range(n):
        p1, p2 = map(int, input().split(' '))
        p[i-1], p[i] = p1, p2

    dp = [[0 for _ in range(n+1)] for _ in range(n+1)]

    for l in range(2, n+1):
        for i in range(1, n-l+2):
            j = i + l - 1
            dp[i][j] = INF
            for k in range(i, j):
                dp[i][j] = min(dp[i][j], dp[i][k] + dp[k+1][j] + p[i-1] * p[k] * p[j])
    print(dp[1][n])


if __name__ == "__main__":
    main()

Python: import math
n = int(input())
p1 = []
p = []
for i in range (n):
    p1.append(list(map(int, input().split())))
    p.append(int(p1[i][0]))

p.append(int(p1[i][1]))

m = [[] for i in range(n)];

for i in range(n):
    for j in range(n):
        m[i].append(0)

for l in range(2, n + 1):
    for i in range(n - l + 1):
        j = i + l - 1
        m[i][j] = 1000000000000000000000
        for k in range(i, j):
            m[i][j] = min(m[i][j], m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j])
print(m[0][5])

Python: def s():
 n=int(input())+1
 e=[input().split()for _  in[0]*~-n]
 p=[int(e[0][0])]+list(int(x[1])for x in e)
 m=[[0]*n for _ in[0]*n]
 for i in range(n):
  for r in range(n-i-1):
   c=r+i+1
   for j in range(r+1,c):
    x=m[r][j]+m[j][c]+p[r]*p[j]*p[c]
    if 1>m[r][c]or m[r][c]>x:m[r][c]=x
 print(m[r][c])
s()

Python: N = int(input())
rc = [list(map(int, input().split())) for _ in range(N)]

DP = [[(0, -1, -1)]*(N) for _ in range(N)]
DP[0] = [(0, r, c) for r, c in rc]

for i in range(1, N):
    for j in range(N-i):
        lis = []
        for k in range(i):
            s, r, c = DP[k][j]
            s2, r2, c2 = DP[i-k-1][j+k+1]
            lis.append((r*c*c2+s+s2, r, c2))
        DP[i][j] = min(lis)
print(DP[-1][0][0])

Python: def calc(p):
    n = len(p) - 1
    m = [[None for i in range(n + 1)] for j in range(n + 1)]
    for x in range(n):
        m[x][x] = 0
    for l in range(2, n + 1):
        for i in range(0, n - l + 1):
            j = i + l - 1
            m[i][j] = float("inf")
            for k in range(i, j):
                m[i][j] = min(m[i][j], m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j])
    return m

n = int(input())
p = []
for i in range(n):
    inp = list(map(int, input().split()))
    if i == 0:
        p.append(inp[0])
        p.append(inp[1])
    elif 0 < i < n - 1:
        p.append(inp[1])
    elif i == (n - 1):
        p.append(inp[1])

m = calc(p)
print(m[0][n - 1])

Python: import sys, copy

num = int(sys.stdin.readline())

if num==1:
    print(0)
    quit()
    
mm = list(map(int, sys.stdin.readline().split()))
for _ in range(num-1):
    mm.append(int(sys.stdin.readline().split()[1]))

used = [False] * num
seq = [0] * (num-2)
minv = 0
j=mm[1]
for i in mm[2:]:
    minv += i*j
    j=i
minv *= mm[0]    

def sequence(n, k, m, t):
    global minv, used, seq
    if k==m:
        t += mm[0]*mm[used[1:].index(False)+1]*mm[num]
        if minv>t:    minv = t
    else:
        for i in range(1,n+1):
            if used[i]: continue
            seq[m] = i
            used[i]=True

            l=i-1
            while l>0 and used[l]:     l-=1
            u=i+1
            while u<num and used[u]:   u+=1
            v = mm[l]*mm[i]*mm[u]
            if minv>t+v: sequence(n, k, m+1, t+v)
            used[i]=False

sequence(num-1, num-2, 0, 0)

print(minv)