Go: package main

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

type Matrix struct {
	r int // num of row
	c int // num of column
}

type Range struct {
	start int // index, inclusive
	end   int // index, inclusive
}

func calcMultiplication(x, y Matrix) (Matrix, int) {
	if x.c != y.r {
		panic("cannnot calculate")
	}
	return Matrix{x.r, y.c}, x.r * y.c * x.c
}

func calcMinMatrixChainMultiplication(matrices []Matrix, r Range, memo map[Range]int) (Matrix, int) {
	if v, ok := memo[r]; ok {
		return Matrix{matrices[0].r, matrices[len(matrices)-1].c}, v
	}
	if len(matrices) == 0 {
		panic("must not be empty")
	} else if len(matrices) == 1 {
		return matrices[0], 0
	}

	var minCount int = math.MaxInt32

	for i := 0; i < len(matrices)-1; i++ {
		formerMatrices := matrices[:i+1]
		latterMatrices := matrices[i+1:]
		matF, countF := calcMinMatrixChainMultiplication(formerMatrices, Range{0, i}, memo)
		matL, countL := calcMinMatrixChainMultiplication(latterMatrices, Range{i + 1, len(matrices) - 1}, memo)
		_, countFL := calcMultiplication(matF, matL)
		count := countF + countL + countFL
		if count < minCount {
			minCount = count
		}
	}
	memo[r] = minCount
	return Matrix{matrices[0].r, matrices[len(matrices)-1].c}, minCount
}

func main() {
	sc := bufio.NewScanner(os.Stdin)
	sc.Split(bufio.ScanWords)
	n, _ := nextInt(sc)
	matrices := make([]Matrix, n)
	for i := 0; i < n; i++ {
		r, _ := nextInt(sc)
		c, _ := nextInt(sc)
		matrices[i] = Matrix{r, c}
	}
	memo := make(map[Range]int)
	_, resultCount := calcMinMatrixChainMultiplication(matrices, Range{0, len(matrices) - 1}, memo)
	fmt.Println(resultCount)
}

func nextInt(sc *bufio.Scanner) (int, error) {
	sc.Scan()
	return strconv.Atoi(sc.Text())
}

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)