動的計画法の基本問題
段目にのぼることが可能かどうかを配列 に記録していきます。
ロボットは上にしか進めないので、下の段から順に可能かどうかを確定してゆくことができます。
「 段目に到達可能なら、 段目に到達可能」
または、
「 段目のいずれかに到達可能なら、 段目に到達可能」
と考えますが、この問題では 段から先に進めなくなるため、前者の考え方を拡張して、
「 段目に到達可能かつ に該当しないなら、 段目に到達可能」
としてみます。
コード例 (Julia)
function solve() # 入力 readInts() = parse.(Int,split(readline())) readInt() = parse(Int,readline()) # 入力データ N = readInt() A = readInts() M = readInt() B = readInts() X = readInt() # モチが設置されている段 mochi = falses(X) for i=1:M mochi[B[i]] = true end dp = falses(X) # 0段目からの最初の動作でのぼることができる段 for i=1:N if A[i] <= X dp[A[i]] = true end end # 下の段から、のぼることができる段の dp を true に設定 for i=1:X if dp[i] && ! mochi[i] for j=1:N k = i + A[j] if k <= X dp[k] = true end end end end # X段目にのぼることができたか if dp[X] println("Yes") else println("No") end end # function solve # main solve()