https://www.acmicpc.net/problem/9465
9465번: 스티커
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의
www.acmicpc.net
풀이
행의 크기가 2, 열의 크기가 n인 입력이 주어졌을 때 상,하,좌,우로 이웃하지 않는 숫자를 더해 만들 수 있는 최대합을 구하는 문제입니다.
숫자를 선택하는 점화식을 찾아 bottom-up방식의 다이나믹 프로그래밍을 사용해 문제를 해결할 수 있습니다.
dp[i][j]에는 i, j 에서의 최대합을 저장해야 합니다. 최종 j에 도달한 후에는 dp[0][j]와 dp[1][j] 중 최대값이 최종 답이 됩니다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int dp[2][100001];
void bottomup(vector<vector<int>> input)
{
dp[0][0] = input[0][0];
dp[1][0] = input[1][0];
dp[0][1] = input[0][1] + dp[1][0];
dp[1][1] = input[1][1] + dp[0][0];
int n = input[0].size();
for (int i = 2; i < n; i++) {
dp[0][i] = input[0][i] + max(dp[1][i-1], dp[1][i-2]);
dp[1][i] = input[1][i] + max(dp[0][i-1], dp[0][i-2]);
}
cout << max(dp[0][n-1], dp[1][n-1]) << endl;
}
int main()
{
// freopen("input.txt", "r", stdin);
int tc, n;
int num;
cin >> tc;
for (int i = 0; i < tc; i++) {
cin >> n;
vector<vector<int>> v(2, vector<int> (n, 0));
for (int j = 0; j < 2; j++) {
for (int k = 0; k < n; k++) {
cin >> num;
v[j][k] = num;
}
}
bottomup(v);
}
return 0;
}
'백준' 카테고리의 다른 글
[C++] 백준 DNA 해독 (1) | 2024.01.30 |
---|---|
[C++] 백준 평균은 넘겠지 (0) | 2024.01.23 |
[C++] 백준 N과 M (9) (0) | 2024.01.21 |
[C++] 백준 쉬운 최단거리 (0) | 2024.01.20 |
[C++] 백준 칵테일 (0) | 2023.03.20 |