Project Euler 114

http://projecteuler.net/index.php?section=problems&id=114


この手の問題は、再帰で書いてメモ化ですね。

def num_ways(n):
    if n <= 2:
        return 1
    else:
        if memo[n] != 0:
            return memo[n]
        
        m = 1 + sum(num_ways(k) for k in range(n - 3) + [ n - 1 ])
        memo[n] = m
        return m

N = 50
memo = [ 0 ] * (N + 1)
print num_ways(N)

漸化式で書くと、

a0 = 1, a1 = 1, a2 = 1
an = 1 + a0 + … an-4 + an-1

なので、これをコード化したほうが短いですね。

N = 50
a = [ 1 ] * 3
for n in range(3, N + 1):
    a.append(1 + sum(a[k] for k in range(n - 3) + [ n - 1 ]))
print a[N]