본문 바로가기
기타/백준일지

[Codility] NumberSolitaire

by 민지기il 2025. 12. 22.
#include <algorithm>
using namespace std;

int solution(vector<int> &A) {
    int answ;
    int n=A.size();
    vector<int> dp(n);
    dp[0]=A[0];
    for(int i=1; i<n; i++){
        int best=dp[i-1];
        for(int k=2; k<=6; k++){
            if(i-k>=0){
                best=max(best, dp[i-k]);
            }
        }
        dp[i]=best+A[i];
    }
    return dp[n-1];
}

 

문제) 0번 칸에서 시작해서 주사위(1~6)로 이동하면서, 밟은 칸 숫자의 합의 최댓값을 구하라

 

DP 아이디어)

dp[i] = i번 칸에 도착했을 때 얻을 수 있는 최대 점수, i번 칸은 i-1 ~ i-6 중 어디에서 왔을 수 있음

dp[i] = A[i] + max(dp[i-1] ~ dp[i-6])

best = "지금까지 발견한 최고 dp 값"

best 갱신: 지금까지 봤던 후보(best)랑 i-k에서 오는 경우 중 더 좋은 걸 best로 하자

 

정리)

for (i = 1 to N-1):
    i로 올 수 있는 이전 칸들(dp[i-1] ~ dp[i-6]) 중
    가장 점수가 큰 것을 찾고
    거기에 A[i]를 더한다

 

'기타 > 백준일지' 카테고리의 다른 글

[Codility] 최대 깃발 개수  (0) 2025.12.17
[Codility] MaxDoubleSliceSum  (0) 2025.12.17
[Codility] 과반수 Leader  (0) 2025.12.17
[Codility] 겹치는 원의 개수  (0) 2025.12.17
[Codility] GenomicRangeQuery  (0) 2025.12.17