AtCoder Beginner Contest 149 D - Prediction and Restriction【Python】
https://atcoder.jp/contests/abc149/tasks/abc149_d
AtCoder ProblemsでDifficulty: 719、Solve Probability: 37%でした。
K回より前は単純に勝てる手を出し、 K回以降は現在勝てる手をK回前に出していなければその手を出し、K回前に出していた場合は残りの2つの手の内、K回後に勝てる方の手は使わないようにすると、最大の得点が得られると考え解くことができました。
下記はかなり冗長なコードとなっています。
N, K = map(int, input().split()) R, S, P = map(int, input().split()) T = list(input()) h = [] ans = 0 for i in range(N): # 相手の手 v = T[i] # K回以降は、現在勝てる手をK回前に出していなければその手を出し、 # K回前に出していた場合は、K回後に勝てる方の手は使わない if i-K >= 0: # K回前に出した手 pre_h = h[i-K] if v == 'r': if pre_h != 'p': ans += P h.append('p') else: if i+K < N: next_v = T[i+K] if next_v == 's': h.append('s') elif next_v == 'p': h.append('r') else: h.append('s') # K回後のじゃんけんが行わなければ何でも良い else: h.append('s') elif v == 's': if pre_h != 'r': ans += R h.append('r') else: if i+K < N: next_v = T[i+K] if next_v == 'r': h.append('s') elif next_v == 'p': h.append('p') else: h.append('s') else: h.append('s') elif v == 'p': if pre_h != 's': ans += S h.append('s') else: if i+K < N: next_v = T[i+K] if next_v == 'r': h.append('r') elif next_v == 's': h.append('p') else: h.append('r') else: h.append('r') # K回より前は単純に勝てる手を選ぶ else: if v == 'r': h.append('p') ans += P elif v == 's': h.append('r') ans += R elif v == 'p': h.append('s') ans += S print(ans)