알고리즘
백준 9465번 스티커 (JAVA)
박카스마시며코딩
2023. 12. 25. 23:18
https://www.acmicpc.net/problem/9465
9465번: 스티커
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의
www.acmicpc.net
저는 DP를 이용해 문제를 풀었습니다.
DP를 통해 이전에 계산했던 것을 다시 계산하지 않도록 하여 문제를 풀었습니다.
package BOJ.dp;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_9465 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int testCnt = Integer.parseInt(br.readLine());
for(int t = 0 ; t < testCnt ; t++){
int m = Integer.parseInt(br.readLine());
int[][] map = new int[2][m];
int[][] dp = new int[2][m];
for(int i = 0 ; i < 2 ; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
for(int j = 0 ; j < m ; j++){
dp[i][j] = NOT_VALID;
map[i][j] = Integer.parseInt(st.nextToken());
}
}
int result = Math.max(cal(1,0,map,2,m,dp),cal(0,0,map,2,m,dp));
System.out.println(result);
}
}
private static final int[] DY = {-1,0,1};
private static final int[] DX = {0,1,0};
private static final int NOT_VALID = -1;
private static int cal(int y, int x, int[][] map, int n, int m,int[][] dp) {
if(x >= m){
return 0;
}
if(dp[y][x] != NOT_VALID){
return dp[y][x];
}
int result = 0;
result = Math.max(result, cal((y+1)%2,x+2,map,n,m,dp));
result = Math.max(result, cal((y+1)%2,x+1,map,n,m,dp));
result += map[y][x];
dp[y][x] = result;
return result;
}
}