스티커 모으기2

108번뇌·2021년 7월 28일
0

https://programmers.co.kr/learn/courses/30/lessons/12971

못풀었다.
문제를 보고 DP라고 감이 와야한다.
이전 방법들이 다음 방법들 계산에 쓰이면서 최대 or 방법의 가지수 구하는 방식의 문제

dp1[0]=dp1[1]=sticker[0]; : 처음에서 시작할 때
dp2[0]=0; dp2[1]=sticker[1]; : 다음칸에서 시작할 때
이렇게 나누는 이유는
14를 정할 때는 맨 끝부분인 10을 더하지 못합니다.
따라서 10을 더할 수 있는 즉, 14가 아닌 6부터 시작하는 dp를 추가로 생성해줘야 한다는 뜻이기 때문이다.
어렵다..

dp1[i] = max(dp1[i - 2] + sticker[i], dp1[i - 1]); : 점화식

#include <iostream>
#include <vector>
using namespace std;


int solution(vector<int> sticker)
{
    int answer =sticker[0];
    int dp1[100002]={0,};
    int dp2[100002]={0,};
    
    dp1[0]=dp1[1]=sticker[0];
    dp2[0]=0; dp2[1]=sticker[1];
    
    for(int i=2; i<sticker.size(); i++)
    {
        if(i!=sticker.size()-1)//맨마지막 10은 넣으면 안된다.
        {
             dp1[i] = max(dp1[i - 2] + sticker[i], dp1[i - 1]);
            answer = dp1[i];
        }
        dp2[i] = max(dp2[i - 2] + sticker[i], dp2[i - 1]);
    }
    
    answer = max(answer, dp2[sticker.size()-1]);
  

    return answer;
}

풀이 설명 블로그 : https://hwan-shell.tistory.com/265

profile
내일 아침 눈을 떳을 때, '기대되는 오늘 하루를 만들기 위해' 나는 오늘도 생각하고 고민한다.

0개의 댓글