In [17]:
import sys

def cutRod(p, n):
    if n == 0:
        return 0
    q = -sys.maxsize - 1
    for i in range(n):
        q = max(q, p[i] + cutRod(p, n-i-1))
    return q

In [3]:
p = [1, 5, 8, 9, 10, 17, 17, 20, 24, 30, 1, 5, 8, 9, 10, 17, 17, 20, 24, 30, 1, 5, 8, 9, 10]

In [19]:
for i in range(len(p)):
    print("i:",i,cutRod(p,i))


i: 0 0
i: 1 1
i: 2 5
i: 3 8
i: 4 10
i: 5 13
i: 6 17
i: 7 18
i: 8 22
i: 9 25
i: 10 30
i: 11 31
i: 12 35
i: 13 38
i: 14 40
i: 15 43
i: 16 47
i: 17 48
i: 18 52
i: 19 55
i: 20 60
i: 21 61
i: 22 65
i: 23 68
i: 24 70

In [5]:
def memoizedCutRod(p, n):
    r = []
    return memoizedCutRodAux(p, n, r)
    
def memoizedCutRodAux(p, n, r):
    q = 0
    if len(r) > n:
        return r[n]
    if n > 0:
        q = -1
        for i in range(n):
            q = max(q, p[i] + memoizedCutRodAux(p, n-i-1, r))
    r.append(q)
    return q

In [6]:
for i in range(len(p)):
    print("i:",i,memoizedCutRod(p,i))


i: 0 0
i: 1 1
i: 2 5
i: 3 8
i: 4 10
i: 5 13
i: 6 17
i: 7 18
i: 8 22
i: 9 25
i: 10 30
i: 11 31
i: 12 35
i: 13 38
i: 14 40
i: 15 43
i: 16 47
i: 17 48
i: 18 52
i: 19 55
i: 20 60
i: 21 61
i: 22 65
i: 23 68
i: 24 70

In [15]:
def bottomUpCutRod(p, n):
    r = [0]
    for j in range(n+1):
        q = -1
        for i in range(j):
            q = max(q, p[i] + r[j-i])
        r[j] = q
    return r[n]

In [16]:
for i in range(len(p)):
    print("i:",i,bottomUpCutRod(p,i))


i: 0 0
i: 1 1
i: 2 6
i: 3 14
i: 4 23
i: 5 33
i: 6 50
i: 7 67
i: 8 87
i: 9 111
i: 10 141
i: 11 171
i: 12 201
i: 13 231
i: 14 261
i: 15 291
i: 16 321
i: 17 351
i: 18 381
i: 19 411
i: 20 441
i: 21 471
i: 22 501
i: 23 531
i: 24 561

In [ ]: