【yukicoder】No.45 回転寿司
週末yukicoder。
問題
問題はこちら
解法
動的計画法です。
個のお寿司が手前に流れてきたときの美味しさの最大をとします。この時と定義しておきます。
の時はお寿司が1つだけなので、そのお寿司を取るしかないので、
の時について、場合を分けて考えてみます。
番目のお寿司をとった場合は、となり、お寿司は2連続は取れないので自動的にの関係になります。
番目のお寿司をとらなかった場合は、となり、お寿司を3連続取らないと美味しさが損になるのでこの場合は番目のお寿司をとった方がいいです。よってとなります。
したがって、番目のお寿司が流れてきたときの美味しさの最大は、
となります。
上の考えでを算出すればOKです。
Python3
コード
N=int(input()) V=list(map(int,input().split())) if N == 1: print(V[0]) else: A=[0]*(N+1) A[1]=V[0] for i in range(2,N+1): A[i] = max(A[i-1], A[i-2]+V[i-1]) print(A[N])