https://www.acmicpc.net/problem/9465
9465번: 스티커
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의
www.acmicpc.net
문제
풀이
만약 스티커를 하나 떼어 냈다고 가정하면 다음에 뗄 수 있는 스티커는 한칸대각선 or 두칸 대각선이다.
즉 , 이 둘중에 큰 값을 선택하면 끝
반대로 말하면 이전의 스티커 점수의 합은 그림과 같이 둘 중 큰 곳에서 가져오면 된다.
파란색의 스티커를 떼어냈다고 가정을 하면 이전의 점수합은 빨간색 둘 중 큰 값을 가져오면 된다는것.따라서 점화식은
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
|
import java.util.*;
import java.io.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int tc = Integer.parseInt(br.readLine());
while(tc-->0){
int n = Integer.parseInt(br.readLine());
int[][] arr = new int[2][n+2];
int[][] dp = new int[2][n+2];
for(int i=0;i<2;i++){
int[] input = Arrays.stream(br.readLine().split(" ")).
mapToInt(Integer::parseInt).toArray();
for(int j=1;j<=input.length;j++)
arr[i][j] = input[j-1];
}
dp[0][1] = arr[0][1]; dp[1][1] = arr[1][1];
dp[0][2] = dp[1][1]+arr[0][2];
dp[1][2] = dp[0][1]+arr[1][2];
for(int i=3;i<=n;i++){
dp[0][i] = arr[0][i] + Math.max(dp[1][i-1],dp[1][i-2]);
dp[1][i] = arr[1][i] + Math.max(dp[0][i-1],dp[0][i-2]);
}
System.out.println(Math.max(dp[0][n],dp[1][n]));
}
}
}
|
cs |
'알고리즘,PS > 백준' 카테고리의 다른 글
[BOJ] 백준 [10971] 외판원 순회2 JAVA (0) | 2021.10.21 |
---|---|
[BOJ] 백준 [2146] 다리만들기 JAVA (0) | 2021.10.14 |
[BOJ] 백준 [11054] 가장 긴 바이토닉 부분 수열 JAVA (0) | 2021.10.13 |
[BOJ] 백준 [2150] 강한 결합 요소 JAVA (0) | 2021.10.08 |
[BOJ] 백준 [19581] 두 번째 트리의 지름 JAVA (0) | 2021.10.04 |