일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- DP
- 알고리즘
- Eclipse
- 소숫점처리
- 반복문
- 자바
- 데이터베이스
- 2156
- 오라클
- 백준
- 동적계획법
- JOIN
- ANSI JOIN
- 변수
- Dynamic Programming
- darkest dark
- db
- select
- 그대로 출력하기
- algoritm
- oracle
- 문자열
- Java
- n x 2 타일링 2
- Algorithm
- SQL
- 10951
- Database
- 입출력
- 데이터길이
Archives
- Today
- Total
Cracking Code
[동적계획법 (D.P.)] 백준 9465: 스티커, Java 본문
1. 접근
단순히 대각선으로, 그리고 순차적으로 오른쪽 방향으로 점점 숫자를 쌓아나가
n 번째 스티커 2장을 비교하여 출력하면 될 줄 알았습니다.
하지만 꼭 대각선으로 나아가야 한다는 규칙은 없었고 그것이 꼭 최댓값을 출력한다는 보장은 없었습니다.
2. 해결
그럼 도대체 어떻게 최댓값을 구할 수 있을까 생각하는 도중
현재 스티커에 접해 있는 스티커는 사용할 수 없으니 사용할 수 없는 스티커를 제외한
최대의 수를 가질 스티커를 골라서 비교하면 되는 간단한 문제였습니다.
n - 1 번째 대각으로 구해오던 수와
그의 바로 뒤쪽에 있는 n - 2 번째 수를 비교하면 최댓값을 구할 수 있었습니다.
3. 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
for (int i = 0; i < t; i++) {
int n = Integer.parseInt(br.readLine());
int[][] arr = new int[2][n + 1];
int[][] dp = new int[2][n + 1];
int ans = 0;
for (int j = 0; j < 2; j++) {
String[] input = br.readLine().split(" ");
for (int k = 1; k <= n; k++) {
arr[j][k] = Integer.parseInt(input[k - 1]);
}
}
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];
}
ans = Math.max(dp[0][n], dp[1][n]);
System.out.println(ans);
}
}
}
'Algorithms > 동적계획법 (Dynamic Programming)' 카테고리의 다른 글
[동적계획법 (D.P.)] 백준 2156: 포도주 시식, Java (0) | 2020.08.16 |
---|---|
[동적계획법 (D.P.)] 백준 11057: 오르막 수, Java (0) | 2020.08.15 |
[동적계획법 (D.P.)] 백준 10844: 쉬운 계단 수, Java (0) | 2020.08.15 |
[동적계획법 (D.P.)] 백준 11727: 2 x N 타일링 2, Java (3) | 2020.08.08 |
Comments