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]