問題
B – トリボナッチ数列
参考
GeeksForGeeks Tribonacci Numbers
英語のサイトですが、トリボナッチ数列の普通の解き方->効率的な解き方のコードが一通りの言語で載っています。
回答
動的計画法
import sys # input処理を高速化する input = sys.stdin.readline def main(): N = int(input()) dp = [0] * (N + 2) dp[0] = 0 dp[1] = 0 dp[2] = 1 for i in range(3, N): num = dp[i - 3] + dp[i - 2] + dp[i - 1] dp[i] = num % 10007 print(dp[N-1]) main()
メモ化再帰
PyPyでもTLE になってしまう。書けなかった。またいつか…。
import sys # input処理を高速化する input = sys.stdin.readline # 許容する再帰処理の回数を変更 sys.setrecursionlimit(10**6+10) def main(): N = int(input()) memo = [-1] * (N+1) def trib(n): if n == 0: return 0 if n == 1: return 0 if n == 2: return 1 if memo[n] >= 0: return memo[n] num = trib(n-3) + trib(n-2) + trib(n-1) memo[n] = num % 10007 return memo[n] print(trib(N-1)) main()