https://www.acmicpc.net/problem/9465
9465번: 스티커
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의
www.acmicpc.net
코드설명
DP 문제입니다.
이전에 풀었던 계단 오르기 문제와 비슷하다고 느꼈습니다.
시작점에서 dp를 생각하지 않고, 이미 이동할 위치에서 이전의 위치를 선택해야합니다.
5 50 10 100 20 40 30 50 70 10 60
위의 문제로 예로들면, 여기서 arr의 시작은 arr[0][1] ~ arr[0][5] 를 의미합니다.
arr[0][2] 가 있다고 가정합니다. 예시에서의 값은 arr[0][2] = 10입니다.
이때 arr[0][2] 가 될 수 있는 값은 arr[1][1] 밖에 없습니다.
arr[0][3] 으로 이동해봅니다.
이때 arr[0][3] 이 될 수 있는 값은 arr[1][2]와 arr[1][1] 입니다.
위의 값들의 최대값( Math.max(arr[1][2], arr[1][1]) + arr[0][3] 들을 비교하여 이동시키면 됩니다.
처음에는 dp[0][0] 으로 처리할려고생각하였지만,
각 스티커의 위치에서 열 기준으로 2개까지 이동할 수 있기에 연산의 처리를 위하여 dp[0][0] 은 0 으로 선언하고 진행합니다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.math.BigInteger; import java.util.*; public class Main { public static int T, N, M; public static int answer = 0; public static int[][] arr; public static int[][] dp; public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); T = Integer.parseInt(st.nextToken()); for(int i=0;i<T;i++) { st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); arr = new int[2][N+1]; dp = new int[2][N+1]; for(int j=0;j<2;j++) { st = new StringTokenizer(br.readLine()); for(int k=1;k<=N;k++) { arr[j][k] = Integer.parseInt(st.nextToken()); } } dp[0][1] = arr[0][1]; dp[1][1] = arr[1][1]; for(int j=2;j<=N;j++) { dp[0][j] = Math.max(dp[1][j-1], dp[1][j-2]) + arr[0][j]; dp[1][j] = Math.max(dp[0][j-1], dp[0][j-2]) + arr[1][j]; } System.out.println(Math.max(dp[0][N], dp[1][N])); } } }