본문 바로가기

코딩테스트/C++

[백준 C++] 9465번: 스티커

https://www.acmicpc.net/problem/9465

 

사자 우리에 넣는것과 비슷한 문제라 생각하고 풀이했다.

 

3차원 dp 배열 dp[100001][3]을 선언하고 앞에는 n의 수를 넣어주고 뒤에는 0일때는 안채웠을때 최대값, 1일때는 위에칸 채웠을때 최대값, 2일때는 아래칸 채웠을때 최대값을 넣어주었다.

 

그리고 최대값을 비교할때 식을 이런식으로 세웠다.

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

 

또한 초항은 

dp[0][0] = 0;
dp[0][1] = score[0][0];
dp[0][2] = score[0][1];

 

요런식으로 먼저 넣어주었다.

 

전체코드이다.

#include <iostream>
#include <algorithm>
#define MAX 100001
using namespace std;
int dp[MAX][3] = { 0, };
int score[MAX][2] = { 0, };
 
int main(int argc, char* argv[])
{
	int test_case;
	cin >> test_case;
 
	for (int T = 1;T <= test_case;T++) {
		int n;
		cin >> n;
 
		for (int i = 0;i < n;i++) {
			cin >> score[i][0];
		}
		for (int i = 0;i < n;i++) {
			cin >> score[i][1];
		}
 
		dp[0][0] = 0;
		dp[0][1] = score[0][0];
		dp[0][2] = score[0][1];
 
		for (int i = 1;i < n;i++) {
			dp[i][0] = max(dp[i - 1][1], dp[i - 1][2]);
			dp[i][1] = max((dp[i - 1][0] + score[i][0]), (dp[i - 1][2] + score[i][0]));
			dp[i][2] = max((dp[i - 1][0] + score[i][1]), (dp[i - 1][1] + score[i][1]));
		}
 
		dp[n][0] = max(max(dp[n - 1][0], dp[n - 1][1]), dp[n - 1][2]);
 
		cout << dp[n][0] << '\n';
 
	}
 
	return 0;
}

 

처음에 좀 해멨지만 금방 바로 잡고 풀 수 있었던 문제, 

 

dp의 공식 찾아내는 방법은 문제를 작게 나누어 푸는 법, 이전으로 돌아가지 않고 푸는 법 이라며 설명을한다.

 

하지만 나는 "컴퓨터 기억메모리를 쓰는 대신 연산을 어떻게 하면 더 적게할까?" 이런식으로 먼저 생각하는것 같다. 

'코딩테스트 > C++' 카테고리의 다른 글

[백준 C++] 1932번: 정수 삼각형  (0) 2024.05.13
[백준 C++] 2156번: 포도주 시식  (0) 2024.05.12
[백준 C++] 11057번: 오르막 수  (0) 2024.05.12
[백준 C++] 1309번: 동물원  (0) 2024.05.12
[백준 C++] 1149번: RGB거리  (0) 2024.05.12