白俊2579号:階段を上る
質問する
題ショートカットキー>白俊2579号:階段を上る
に答える
これは3つの規則を持つ階段を上がることで得られる最大値を求める問題であり,dp(Dynamic Programming)で解くことができる.
初期化プロセスは次のとおりです.
dp[1] = score[1]
:最初の階段までの最大値はもちろんscore[1].dp[2] = score[1]+score[2]
:第2レベルまでの最大値ももちろんscore[1]+score[2]です.dp[3] = max(score[1]+score[3], score[2]+score[3])
:第3レベルまでの最大値は連続する3グリッドを超えてはならないため、score[1]+score[3]またはscore[2]+score[3]となる.次の点火方式でdpを行えばいいです.
max(score[i]+dp[i-2] , score[i]+score[i-1]+dp[i-3])
:2級ジャンプ台or 1級ジャンプ台(連続3級xを踏む)#include<iostream>
#define MAX 301
using namespace std;
int N;
int score[MAX], dp[MAX];
int main(){
ios_base::sync_with_stdio(0); cin.tie(0);
// 입력
cin>>N;
for(int i=1; i<=N; i++) cin>>score[i];
// 초기화
dp[1] = score[1];
dp[2] = score[1]+score[2];
dp[3] = max(score[1]+score[3], score[2]+score[3]);
// dynamic programming
for(int i=4; i<=N; i++)
dp[i] = max(score[i]+dp[i-2] , score[i]+score[i-1]+dp[i-3]);
// 정답 출력
cout << dp[N];
}
Reference
この問題について(白俊2579号:階段を上る), 我々は、より多くの情報をここで見つけました https://velog.io/@danbibibi/백준-2579번-계단-오르기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol