Skip to content

Commit 98a4077

Browse files
committed
[Silver I] Title: 스티커, Time: 640 ms, Memory: 116340 KB -BaekjoonHub
1 parent 95642dc commit 98a4077

File tree

2 files changed

+73
-0
lines changed

2 files changed

+73
-0
lines changed
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# [Silver I] 스티커 - 9465
2+
3+
[문제 링크](https://www.acmicpc.net/problem/9465)
4+
5+
### 성능 요약
6+
7+
메모리: 116340 KB, 시간: 640 ms
8+
9+
### 분류
10+
11+
다이나믹 프로그래밍
12+
13+
### 제출 일자
14+
15+
2024년 12월 23일 10:33:18
16+
17+
### 문제 설명
18+
19+
<p>상근이의 여동생 상냥이는 문방구에서 스티커 2n개를 구매했다. 스티커는 그림 (a)와 같이 2행 n열로 배치되어 있다. 상냥이는 스티커를 이용해 책상을 꾸미려고 한다.</p>
20+
21+
<p>상냥이가 구매한 스티커의 품질은 매우 좋지 않다. 스티커 한 장을 떼면, 그 스티커와 변을 공유하는 스티커는 모두 찢어져서 사용할 수 없게 된다. 즉, 뗀 스티커의 왼쪽, 오른쪽, 위, 아래에 있는 스티커는 사용할 수 없게 된다.</p>
22+
23+
<p><img alt="" src="https://www.acmicpc.net/upload/images/sticker.png" style="height:150px; width:575px"></p>
24+
25+
<p>모든 스티커를 붙일 수 없게된 상냥이는 각 스티커에 점수를 매기고, 점수의 합이 최대가 되게 스티커를 떼어내려고 한다. 먼저, 그림 (b)와 같이 각 스티커에 점수를 매겼다. 상냥이가 뗄 수 있는 스티커의 점수의 최댓값을 구하는 프로그램을 작성하시오. 즉, 2n개의 스티커 중에서 점수의 합이 최대가 되면서 서로 변을 공유 하지 않는 스티커 집합을 구해야 한다.</p>
26+
27+
<p>위의 그림의 경우에 점수가 50, 50, 100, 60인 스티커를 고르면, 점수는 260이 되고 이 것이 최대 점수이다. 가장 높은 점수를 가지는 두 스티커 (100과 70)은 변을 공유하기 때문에, 동시에 뗄 수 없다.</p>
28+
29+
### 입력
30+
31+
<p>첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스의 첫째 줄에는 n (1 ≤ n ≤ 100,000)이 주어진다. 다음 두 줄에는 n개의 정수가 주어지며, 각 정수는 그 위치에 해당하는 스티커의 점수이다. 연속하는 두 정수 사이에는 빈 칸이 하나 있다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다. </p>
32+
33+
### 출력
34+
35+
<p>각 테스트 케이스 마다, 2n개의 스티커 중에서 두 변을 공유하지 않는 스티커 점수의 최댓값을 출력한다.</p>
36+
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import java.io.*;
2+
import java.math.BigInteger;
3+
import java.util.*;
4+
5+
public class Main {
6+
public static void main(String[] args) throws IOException {
7+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
8+
9+
int T = Integer.parseInt(br.readLine());
10+
11+
StringTokenizer st;
12+
for(int i =0; i<T; i++) {
13+
14+
15+
int N= Integer.parseInt(br.readLine());
16+
int arr[][] = new int[3][N+1];
17+
int dp[][] = new int[3][N+1];
18+
for(int j=1; j<=2; j++) {
19+
st = new StringTokenizer(br.readLine());
20+
for(int k = 1; k<=N; k++) {
21+
arr[j][k] = Integer.parseInt(st.nextToken());
22+
}
23+
}
24+
25+
dp[1][1] = arr[1][1];
26+
dp[2][1] = arr[2][1];
27+
28+
for(int j = 2; j<=N; j++) {
29+
dp[1][j] = Math.max(dp[2][j-1], dp[2][j-2] )+ arr[1][j];
30+
dp[2][j] = Math.max(dp[1][j-1],dp[1][j-2]) + arr[2][j];
31+
}
32+
33+
System.out.println(Math.max(dp[1][N],dp[2][N]));
34+
35+
}
36+
}
37+
}

0 commit comments

Comments
 (0)