
알고리즘 문제 풀이
문제
https://www.acmicpc.net/problem/9465
9465번: 스티커
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의
www.acmicpc.net
풀이
다이나믹 프로그래밍 문제이다.
역시나 점화식을 찾는 게 가장 중요하다

점화식을 머릿속으로 도출 해내는 게 힘들어서 직접 그리면서 찾았다
dp[i][0] = max(dp[i - 1][1], dp[i - 2][1]) + arr[i][0];
dp[i][1] = max(dp[i - 1][0], dp[i - 2][0]) + arr[i][1];
핵심이 되는 식이다.
소스 코드
#include <iostream>
#include <string>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <map>
#include <cctype>
#include <set>
#include <string.h>
using namespace std;
int T, N;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> T;
for (int test = 0; test < T; test++) {
int arr[100000][2];
int dp[100000][2];;
cin >> N;
for (int i = 0; i < N; i++) {
cin >> arr[i][0];
}
for (int i = 0; i < N; i++) {
cin >> arr[i][1];
}
dp[0][0] = arr[0][0];
dp[0][1] = arr[0][1];
dp[1][0] = arr[0][1] + arr[1][0];
dp[1][1] = arr[0][0] + arr[1][1];
for (int i = 2; i < N; i++) {
dp[i][0] = max(dp[i - 1][1], dp[i - 2][1]) + arr[i][0];
dp[i][1] = max(dp[i - 1][0], dp[i - 2][0]) + arr[i][1];
}
int result = max(dp[N - 1][0], dp[N - 1][1]);
cout << result << '\n';
}
}'Programming Practice > BOJ' 카테고리의 다른 글
| [BOJ] 백준 16953 스티커 - S2 (C++) (0) | 2022.06.17 |
|---|---|
| [BOJ] 백준 1991 트리 순회 (C++) (0) | 2022.04.26 |
| [BOJ] 백준 1932 정수 삼각형 (C++) (0) | 2022.04.24 |
| [BOJ] 백준 2407 조합 (C++) (0) | 2022.04.21 |
| [BOJ] 백준 15650 N과 M (2) (C++) (0) | 2022.04.20 |