[문제]
https://www.acmicpc.net/problem/9465
[풀이]
처음 bfs 문제인 줄 알고 엄청 헤맸다.....n ≤ 100,000 이라 dp로 해결할 수 있다.
첫번째 스티커를 뗀다고 생각해보자. 그 다음에 뗄 수 있는 스티커는 오른쪽과 아래의 10, 30을 제외한 스티커이다. 50을 뗀다면 그 다음은 100, 10, 60 처럼 위, 아래로 움직이며 스티커를 뗄 수 있을 것이다.
그렇다면 50만 뗄 수 있을까? 아니다!
50이 아니라 옆옆에 있는 100을 뗄 수도 있고, 50 옆에 있는 70을 뗄 수도 있다. 그런데 만약 100을 뗀다고 가정하면, 아래에 있는 50 역시 뗄 수 있으므로 처음과 같은 결과가 될 것이다.
이를 고려해서 점화식을 짜면 다음과 같다.
dp[0][i] = sticker[0][i] + max(dp[1][i - 1], dp[1][i - 2]);
dp[1][i] = sticker[1][i] + max(dp[0][i - 1], dp[0][i - 2]);
[코드]
#include <iostream>
#include <vector>
#include <queue>
#include <cmath>
#include <cstring>
using namespace::std;
int sticker[2][100001];
int dp[2][100001];
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t;
cin >> t;
for(int i=0; i<t; i++){
int n;
cin >> n;
for(int i=0; i<2; i++){
for(int j=0; j<n; j++){
int value;
cin >> value;
sticker[i][j] = value;
}
}
dp[0][0] = sticker[0][0];
dp[0][1] = sticker[0][1] + sticker[1][0];
dp[1][0] = sticker[1][0];
dp[1][1] = sticker[0][0] + sticker[1][1];
for(int i=2; i<n; i++){
dp[0][i] = sticker[0][i] + max(dp[1][i-1], dp[1][i-2]);
dp[1][i] = sticker[1][i] + max(dp[0][i-1], dp[0][i-2]);
}
cout << max(dp[0][n-1], dp[1][n-1]) << "\n";
}
}
'알고리즘 공부 및 문제 풀이 > 백준(BOJ)' 카테고리의 다른 글
[boj] 백준 1300 k번째 수 (c++) - 이분 탐색 (0) | 2022.06.24 |
---|---|
[boj] 백준 1655 가운데를 말해요 (C++) - heap (0) | 2022.06.23 |
[boj] 백준 11505 구간 곱 구하기 (c++) - 세그먼트 트리 (0) | 2022.06.20 |
[boj] 백준 1194 달이 차오른다, 가자 (c++) - 비트마스킹, BFS (0) | 2022.06.19 |
[boj] 백준 1766 문제집 (c++) - 위상정렬 (0) | 2022.05.20 |