Post

baekjoon 9465:스티커

baekjoon 9465 스티커

9465번 스티커

접근

지금 스티커를 놓아야 할 자리와 (column number), 직전 column에서 위에 스티커가 있는지
아래 스티커가 있는지 여부로 dp를 만들었다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//9465
#include <iostream>
#include <vector>
#include <array>
using namespace std;
array<array<int, 100000>, 3> cache;
int dp(int status, int cur, int n, vector<vector<int>>& v);
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));
    for(int i = 0; i < n; i++) cin >> v[0][i];
    for(int i = 0; i < n; i++) cin >> v[1][i];
    fill(cache[0].begin(), cache[0].begin()+n, -1);
    fill(cache[1].begin(), cache[1].begin()+n, -1);
    fill(cache[2].begin(), cache[2].begin()+n, -1);

    
    
    cout << dp(0, 0, n, v) << '\n';
  }
  return 0;
}
int dp(int status, int cur, int n, vector<vector<int>>& v){
  if(cur == n) return 0;
  int& ret = cache[status][cur];
  if(ret != -1) return ret;
  ret = 0;
  if(status == 0){
    ret = max(ret, dp(1, cur+1, n, v)+v[0][cur]);
    ret = max(ret, dp(2, cur+1, n, v)+v[1][cur]);
  }
  else if(status == 1){
    ret = max(ret, dp(0, cur+1, n, v));
    ret = max(ret, dp(2, cur+1, n, v)+v[1][cur]);
  }
  else if(status == 2){
    ret = max(ret, dp(0, cur+1, n, v));
    ret = max(ret, dp(1, cur+1, n, v)+v[0][cur]);
  }
  return ret;
  
}

배운 점

기초적인 dp 문제였다.

This post is licensed under CC BY 4.0 by the author.