본문 바로가기
백준

[C++] 백준 스티커

by MINU.SHINNNN 2024. 1. 22.

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