白準-階段を登る(2579)



Dynamic Programming


質問する


階段を登るゲームは階段の下の起点から階段の先端の終点までのゲームです.図1>に示すように、階段ごとに一定の点数が書かれており、階段を踏むと階段の点数が得られます.


<図2>に示すように、始点から、第1、2、4、6段の階段を歩いて終点に着き、合計10+20+25+20=75点となる.
階段を登るには以下のルールがあります.
1. 계단은 한 번에 한 계단씩 또는 두 계단씩 오를 수 있다. 즉, 한 계단을 밟으면서 이어서 다음 계단이나, 다음 다음 계단으로 오를 수 있다.
2. 연속된 세 개의 계단을 모두 밟아서는 안 된다. 단, 시작점은 계단에 포함되지 않는다.
3. 마지막 도착 계단은 반드시 밟아야 한다.
そのため、最初の階段に沿って、2番目か3番目の階段を歩くことができます.しかし、最初の階段を踏んで4番目の階段を登ったり、最初の階段、2番目の階段、3番目の階段を連続して踏んだりすることはできません.
各段階の点数を与える場合は、ゲームの総点数の最値を求めるプログラムを作成します.

入力


入力した最初の行には、階段の数が表示されます.
2行目から、1行1つ、一番下の階段から、各階段に書いてある点数を順番にあげます.階段の個数は300以下の自然数で、階段に書いてある点数は10000以下の自然数です.

しゅつりょく


1行目に階段を登るゲームで得られる総得点の最値を出力します.
import sys

input = sys.stdin.readline
score = []
n = int(input())
maxScore = [None] * 300

for i in range(n):
    score.append(int(input()))


for i in range(n):
    if i == 0:
        maxScore[0] = score[i]
        continue

    elif i == 1:
        maxScore[1] = score[0] + score[1]
        continue

    elif i == 2:
        maxScore[2] = max(score[0], score[1]) + score[2]
        continue

    maxScore[i] = max(maxScore[i-3] + score[i-1], maxScore[i-2]) + score[i]

print(maxScore[n - 1])

参照)
https://won-percent.tistory.com/entry/はい-DP-質問-推奨
https://yoonhoohwang.tistory.com/67