반응형

2행 4열 크기의 스티커에 다음과 같이 번호를 붙여보겠습니다.

| 1 | 2 | 3 | 4 |

| 5 | 6 | 7 | 8 |

먼저 1열의 스티커에 대해서 보겠습니다.

만약 1번 스티커를 사용한다면, 대각선 방향으로 6번과 3번의 스티커를 사용하거나 7번의 스티커를 사용할 수 있습니다.

만약 5번 스티커를 사용한다면, 대각선 방향으로 2번과 7번의 스티커를 사용하거나 3번의 스티커를 사용할 수 있습니다.

즉, 대각선 방향으로 2열 연달아 스티커를 사용했던 경우와 대각선으로 2열 떨어진 스티커를 사용했을 때의 최댓값을 구해주면 됩니다.

a[0...1][i]는 i열에서 0 또는 1행의 스티커를 사용했을 때 나올 수 있는 최댓값입니다.

a[0][i] = max(a[1][i-1], a[1][i-2]) + a[0][i];

a[1][i] = max(a[0][i-1], a[0][i-2]) + a[1][i];

최종적으로 가장 끝열에서 각 행에 스티커를 붙였을 때 더욱 큰 값이 얻을 수 있는 최대 점수입니다.

 

#include <iostream>
#include <algorithm>
using namespace std;
int main() {
	int t, n, a[2][100000];
	scanf("%d", &t);
	while (t--) {
		scanf("%d", &n);
		for (int i = 0; i < 2; i++)
			for (int j = 0; j < n; j++) scanf("%d", &a[i][j]);

		a[0][1] = max(a[0][0], a[0][1] + a[1][0]); // 두번째 열에 대해서는
		a[1][1] = max(a[1][0], a[0][0] + a[1][1]); // 직접 구해둠. 첫번째 열은 기존 입력값

		for (int i = 2; i < n; i++) {
			a[0][i] = max(a[1][i-1], a[1][i-2]) + a[0][i];
			a[1][i] = max(a[0][i-1], a[0][i-2]) + a[1][i];
		}
		printf("%d\n", max(a[0][n-1], a[1][n-1]));
	}
}
반응형

'Algorithm' 카테고리의 다른 글

백준 11055 : 가장 큰 증가 부분 수열  (0) 2021.11.12
백준 1699 : 제곱수의 합  (0) 2021.11.12
백준 2193 : 이친수  (0) 2021.11.12
백준 11057 : 오르막 수  (0) 2021.11.12
백준 15990 : 1, 2, 3 더하기 5  (0) 2021.11.12

+ Recent posts