알고리즘

[백준]9465_스티커_dp

Lahezy 2022. 9. 25.
728x90

[문제 링크]

https://www.acmicpc.net/problem/9465

 

9465번: 스티커

첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의

www.acmicpc.net

 

[생각 흐름]

dp 방법으로 해결하였다

선택할 수 있는 방법이 (1번 줄, 2번 줄) OX, XO, XX 세 가지를 가질 수 있으므로 (O는 스티커가 있다, X는 스티커가 없는 경우)

각 경우에 맞춰서 초기값을 계산하였다.

 

그리고 아래의 코드와 같이 ox-> xx , ox->xo, xx-> ox, xx->xo, xx->xx , xo->ox , xo->xx로 7가지의 경우로 진행할 수 있다. 

그리고 이동한 후 ox -> xx와 xx-> xx, xo -> xx 중 가장 큰 값을 xx 테이블에 넣는 방식으로 마지막 column까지 진행하여

마지막 칸에서 제일 큰 값을 출력해주면 된다.

 

int ox_xx = map1[i-1];
int ox_xo = map1[i-1]+map[1][i];
int xx_ox = map3[i-1]+map[0][i];
int xx_xx =map3[i-1];
int xx_xo = map3[i-1]+map[1][i];
int xo_xx = map2[i-1];
int xo_ox = map2[i-1]+map[0][i];

map1[i]=Math.max(xx_ox,xo_ox);
map2[i] = Math.max(ox_xo,xx_xo);
map3[i] = Math.max(Math.max(ox_xx,xx_xx),xo_xx);

 

 

[코드]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        StringBuilder sb= new StringBuilder();
        int tc = Integer.parseInt(br.readLine());
        while(tc-->0){
            int col = Integer.parseInt(br.readLine());
            int map[][] = new int[2][col];
            int map1[] = new int[col]; //OX
            int map2[] = new int[col]; //XO
            int map3[] = new int[col]; //XX
            for(int i=0;i<2;i++){
                st=new StringTokenizer(br.readLine());
                for(int j=0;j<col;j++)map[i][j] = Integer.parseInt(st.nextToken());
            }
            map1[0] = map[0][0];
            map2[0] = map[1][0];
            for(int i=1;i<col;i++){
                map1[i]=Math.max(map3[i-1]+map[0][i],map2[i-1]+map[0][i]);
                map2[i] = Math.max(map3[i-1]+map[1][i],map1[i-1]+map[1][i]);
                map3[i] = Math.max(map3[i-1],Math.max(map1[i-1],map2[i-1]));


                /*
                //ex) ox -> xx 가 되는 경우의 케이스
                int ox_xx = map1[i-1];
                int ox_xo = map1[i-1]+map[1][i];
                int xx_ox = map3[i-1]+map[0][i];
                int xx_xx =map3[i-1];
                int xx_xo = map3[i-1]+map[1][i];
                int xo_xx = map2[i-1];
                int xo_ox = map2[i-1]+map[0][i];

                map1[i]=Math.max(xx_ox,xo_ox);
                map2[i] = Math.max(ox_xo,xx_xo);
                map3[i] = Math.max(Math.max(ox_xx,xx_xx),xo_xx);
                 */
            }
            sb.append(Math.max(Math.max(map1[col-1],map2[col-1]),map3[col-1])+"\n");
        }
        System.out.println(sb);
    }
}
728x90

'알고리즘' 카테고리의 다른 글

[백준]10830_행렬 제곱_분할  (0) 2022.09.27
[백준]14503_로봇청소기  (0) 2022.09.26
[백준]9935_문자열폭발_Stack  (0) 2022.09.25
[Programmers]합승 택시 요금  (1) 2022.09.23
[Programmers] 프렌즈4블록  (0) 2022.09.20

댓글