[Baekjoon,9465] 스티커

1 분 소요

먼저 방향을 정해야 한다. 방향은 왼쪽에서 오른쪽으로 진행하자. 만약 진행 중 현재 스티커를 선택한다면 오른쪽과 아래쪽에 붙어있는 스티커는 이용할 수 없다. 그러면 다음 스티커는 대각선 방향 스티커이다. 그런데 이 스티커 대신 이 보다 한 칸 오른쪽에 있는 스티커를 선택하는 것이 더 결과가 커질 수 있다. 예를 들어 아래와 같은 경우를 보자.

. X . 30 100 10
X . X 10  60 10

현재 X표시를 한 부분이 선택한 부분이라고 가정하자. 이때 30을 선택하는 것 보다 30에 해당하는 열을 선택하지 않고 100을 선택하는 결과 값이 더 크다. 이처럼 두 가지 경우를 나눠서 현재 위치의 최대값을 메모이제이션 하면 해결할 수 있다.

구현

이를 코드로 구현하면 아래와 같다. 다음 선택지의 경우 !연산자를 이용하여 간단히 접근하고 있다.

#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;

const int MAX_N = 100001;

int N;
int score[2][MAX_N], cache[2][MAX_N];

int getMaxScore(int r, int c)
{
	if (c >= N)
		return 0;
	
	int& ret = cache[r][c];
	if (ret != -1)
		return ret;

	return ret = score[r][c] + max(getMaxScore(!r, c + 1), getMaxScore(!r, c + 2));
}

int main()
{
	int T;
	cin >> T;
	while (T--)
	{
		cin >> N;
		for (int r = 0;r < 2;++r)
			for (int i = 0;i < N;++i)
				scanf("%d", &score[r][i]);
		
		int ret = 0;
		memset(cache, -1, sizeof(cache));
		ret = max(getMaxScore(0, 0), getMaxScore(1, 0));
		
		cout << ret << endl;
	}
}

댓글남기기