[02579]階段を登る
2869 ワード
[02579]階段を登る
質問する
階段を登るゲームは階段の下の起点から階段の先端の終点までのゲームです.図1>に示すように、階段ごとに一定の点数が書かれており、階段を踏むと階段の点数が得られます.
<図1>
<図2>に示すように、始点から、第1、2、4、6段の階段を歩いて終点に着き、合計10+20+25+20=75点となる.
<図2>
階段を登るには以下のルールがあります.
そのため、最初の階段に沿って、2番目か3番目の階段を歩くことができます.しかし、最初の階段を踏んで4番目の階段を登ったり、最初の階段、2番目の階段、3番目の階段を連続して踏んだりすることはできません.
入力
入力した最初の行には、階段の数が表示されます.
2行目から、1行1つ、一番下の階段から、各階段に書いてある点数を順番にあげます.階段の個数は300以下の自然数で、階段に書いてある点数は10000以下の自然数です.
しゅつりょく
1行目に階段を登るゲームで得られる総得点の最値を出力します.
コード#コード#
#include <iostream>
#include <algorithm> // reverse
#include <cstring> // memset
using namespace std;
/* 조건 */
#define MAX_N 301
/* 변수 */
int N;
int score[MAX_N], memo[MAX_N];
/* 함수 */
int dp(int idx) {
if (idx >= N) return 0; // 범위를 넘어간 경우 (첫번째 계단)
int& ret = memo[idx];
if (ret != -1) return ret;
return ret = max(score[idx] + dp(idx + 2), score[idx] + score[idx + 1] + dp(idx + 3));
}
int main() {
/* 입력 */
cin >> N; // 갯수 입력
for(int i = 0; i < N; i++) { // score에 모든 점수 저장
cin >> score[i];
}
/* 풀이 */
score[N] = 0;
memset(memo, -1, sizeof(memo)); // memo를 -1로 모두 전환
reverse(score, score + N); // score를 거꾸로 저장
/* 출력 */
cout << dp(0) << endl;
}
解法
ろんり
このゲームでは、階段を踏んで歩く場合、以下の2種類があります.
このため、上記の2つの場合、より大きな値を選択して保存し、最後に最も高い値を見つけることができます.
しかし、最後の階段はいつも踏まなければならないので、逆関数で反対側から始めます.
へんすう
n.関数
ソース
上位白駿[025799]レベル
https://www.acmicpc.net/problem/2579
Reference
この問題について([02579]階段を登る), 我々は、より多くの情報をここで見つけました https://velog.io/@kkoala/02579-계단-오르기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol