[백준 9465번 C/C++] 스티커
9465번 C/C++] 스티커
https://www.acmicpc.net/problem/9465
9465번: 스티커
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의
www.acmicpc.net
해결전략
동적구현법, 다이나믹 프로그래밍 Dynamic Programming (DP)
정답 코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
vector<vector<int>> v(2, vector<int>(n + 1, 0)); // 스티커 점수를 저장할 배열
vector<vector<int>> dp(2, vector<int>(n + 1, 0)); // dp 배열
for (int y = 0; y < 2; y++)
for (int x = 1; x <= n; x++)
cin >> v[y][x];
dp[0][1] = v[0][1];
dp[1][1] = v[1][1];
for (int x = 2; x <= n; x++) {
for (int y = 0; y < 2; y++) {
int opposite = (y + 1) % 2; // 현재 행과 다른 행 계산
// 이전 열에서 선택하지 않은 행의 최대 점수와 현재 스티커 점수를 더해서, 현재 위치에서의 최대 점수 계산
// 혹은 이전 열에서의 최대 점수를 그대로 가져오는 경우 중, 더 큰 값을 dp[y][x]에 저장
dp[y][x] = max({ dp[y][x - 1], dp[opposite][x - 1] + v[y][x], dp[opposite][x - 2] + v[y][x] });
}
}
cout << max(dp[0][n], dp[1][n]) << "\n"; // 두 행 중에서 최대 점수 출력
}
return 0;
}
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 15655번 C/C++] N과 M (6) (0) | 2023.12.25 |
---|---|
[백준 15654번 C/C++] N과 M (5) (0) | 2023.12.24 |
[백준 1799번 C/C++] 비숍 (1) | 2023.12.22 |
[백준 13549번 C/C++] 숨박꼭질 3 (0) | 2023.12.20 |
[백준 11725번 C/C++] 트리의 부모 찾기 (0) | 2023.12.19 |
댓글
이 글 공유하기
다른 글
-
[백준 15655번 C/C++] N과 M (6)
[백준 15655번 C/C++] N과 M (6)
2023.12.25 -
[백준 15654번 C/C++] N과 M (5)
[백준 15654번 C/C++] N과 M (5)
2023.12.24 -
[백준 1799번 C/C++] 비숍
[백준 1799번 C/C++] 비숍
2023.12.22 -
[백준 13549번 C/C++] 숨박꼭질 3
[백준 13549번 C/C++] 숨박꼭질 3
2023.12.20