알고리즘

[C++] 백준 9465번 스티커

J3SUNG 2019. 5. 23. 00:40
728x90

 

다이나믹 프로그래밍 문제입니다.

 

이웃하는 스티커를 뜯을 수 없을때 가장 높은 점수를 출력하는 문제입니다.

 

현재 찾고자 하는 위치는 

1. 한칸 전 대각선 위치

2. 두칸 전 현재 위치

두가지 방법에서 올 수 있습니다.

 

memo[0][k] = max(memo[1][k - 1], memo[1][k - 2]) + arr[0][k];

memo[1][k] = max(memo[0][k - 1], memo[0][k - 2]) + arr[1][k];

위의 사진 = max(1번, 2번) + 현재 위치 값

밑의 사진 = max(1번, 2번) + 현재 위치 값

 

#include <iostream>
#include <algorithm>
using namespace std;

int memo[2][100010];
int arr[2][100010];


void init()
{
   for (int i = 0; i < 2; ++i) {   
      for (int j = 0; j < 100010; ++j) {
         arr[i][j] = 0;
         memo[i][j] = 0;
      }
   }
}

int main(int argc, char *argv[])
{
   
   int cycle;
   cin >> cycle;
   for (int i = 0; i < cycle; ++i) {
      int n;
      cin >> n;
      init();
      for (int j = 0; j < 2; ++j) {
         for (int k = 0; k < n; ++k) {
            cin >> arr[j][k];
            memo[j][k] = arr[j][k];
         }
      }
      memo[0][1] = memo[1][0] + arr[0][1];
      memo[1][1] = memo[0][0] + arr[1][1];
      for (int k = 2; k < n; ++k) {
         for (int j = 0; j < 2; ++j) {
            if (j == 1) {
               memo[j][k] += max(memo[0][k - 1], memo[0][k - 2]);
            }
            else {
               memo[j][k] += max(memo[1][k - 1], memo[1][k - 2]);
            }
         }
      }
      int maxNum = -987654321;
      
      maxNum = max(memo[1][n - 1], memo[0][n - 1]);
      cout << maxNum << endl;
   }
   
   return 0;
}