Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 괄호추가하기
- 17143
- 다리 만들기2
- Java
- 백준
- 재귀
- 부분수열의 합
- 로또
- Ajax
- 9095
- 17136
- 알고리즘
- 16637
- 14502
- 인스타
- 14888
- 장고
- 구슬탈출2
- 좋아요
- 6603
- 1182
- 인스타그램
- 미세먼지 안녕!
- 색종이 붙이기
- django
- 연산자 끼워넣기
- 17144
- 댓글
- 따라하기
- 17472
Archives
- Today
- Total
Be a developer
백준 1149 RGB거리 본문
기본적인 DP 문제이다.
임의의 한 지점(i 번째)에 있는 집이 빨강일 때, 초록일 때 파랑일 때로 나누어서 생각한다.
1)빨강일 때: min(i-1번 째 있는 집이 파랑, i-1번 째 있는 집이 노랑) + i번째가 빨강일 때 칠하는 비용
2)초록일 때: min(i-1번 째 있는 집이 빨강, i-1번 째 있는 집이 파랑) + i번째가 초록일 때 칠하는 비용
3)파랑일 때: min(i-1번 째 있는 집이 빨강, i-1번 째 있는 집이 초록) + i번째가 파랑일 때 칠하는 비용
따라서 DP 배열을 선언할 때 2차원 배열로 선언하고 dp[n][3]으로 생선한다.(n은 집의 개수, 3은 빨강,초록,파랑)
마지막 최솟값은 n번째 집의 min(빨강,초록,파랑) 이다.
코드는 아래와 같다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main1149 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
// 0: 빨강, 1: 초록, 2: 파랑
int[][] input = new int[n][3];
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
input[i][0] = Integer.parseInt(st.nextToken());
input[i][1] = Integer.parseInt(st.nextToken());
input[i][2] = Integer.parseInt(st.nextToken());
}
int[][] dp = new int[n][3];
dp[0][0] = input[0][0];
dp[0][1] = input[0][1];
dp[0][2] = input[0][2];
for (int i = 1; i < n; i++) {
dp[i][0] = (dp[i - 1][1] + input[i][0] < dp[i - 1][2] + input[i][0]) ? dp[i - 1][1] + input[i][0]
: dp[i - 1][2] + input[i][0];
dp[i][1] = (dp[i - 1][0] + input[i][1] < dp[i - 1][2] + input[i][1]) ? dp[i - 1][0] + input[i][1]
: dp[i - 1][2] + input[i][1];
dp[i][2] = (dp[i - 1][0] + input[i][2] < dp[i - 1][1] + input[i][2]) ? dp[i - 1][0] + input[i][2]
: dp[i - 1][1] + input[i][2];
}
int ans = min(dp[n - 1][0], dp[n - 1][1], dp[n - 1][2]);
System.out.println(ans);
}
private static int min(int i, int j, int k) {
int ret;
if (i < j)
ret = i;
else
ret = j;
if (ret > k)
ret = k;
return ret;
}
}
'알고리즘' 카테고리의 다른 글
Java로 알고리즘 풀면서 명심할 사항들 (0) | 2019.09.17 |
---|---|
백준 12851 숨바꼭질 2 (0) | 2019.04.09 |
백준 2251 물통 (0) | 2019.04.09 |
백준 9019 DSLR (0) | 2019.04.08 |
백준 13913 숨바꼭질 4 (0) | 2019.04.08 |
Comments