ABC306D - Poisonous Full-Course

解法1:DP

考え方

dp[i][j] = i品目を食べて状態がj(0:お腹を壊していない/1:壊している)のときの食べた料理の美味しさの総和の最大値

回答例

N = int(input())
XY = [list(map(int, input().split())) for _ in range(N)]

dp = [[0]*2 for _ in range(N+1)]
dp[0][1] = -1<<60
for i in range(N):
    x, y = XY[i]
    if x == 0:
        dp[i+1][0] = max(dp[i][0], dp[i][0] + y, dp[i][1] + y)
        dp[i+1][1] = dp[i][1]
    if x == 1:
        dp[i+1][0] = dp[i][0]
        dp[i+1][1] = max(dp[i][0] + y, dp[i][1])

print(max(dp[-1]))