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