BOJ::1149 RGB거리
https://www.acmicpc.net/problem/1149
다이나믹프로그래밍 문제이다.
i번째 집이 빨강,파랑,초록일 경우 각각 최소값이 오도록 2차원배열을 만들었다
ex)
i번째 집을 빨강으로 칠할 경우 :
i번째집을 빨강으로칠하는 비용 + min(i-1번째집을 파랑으로 칠한경우, i-1번째 집을 초록으로 칠한 경우)
JAVA
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; class Main{ static int n; static int d[][]; static RGB list[]; public static void main(String args[]) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); n=Integer.parseInt(br.readLine()); d=new int[n+1][3]; list = new RGB[n+1]; for(int i = 1 ; i <= n ; i++){ StringTokenizer st = new StringTokenizer(br.readLine()); int r = Integer.parseInt(st.nextToken()); int g = Integer.parseInt(st.nextToken()); int b = Integer.parseInt(st.nextToken()); list[i]=new RGB(r,g,b); } d[1][0]=list[1].r; d[1][1]=list[1].g; d[1][2]=list[1].b; for(int i = 2 ; i <= n ; i++){ d[i][0]=list[i].r+min(d[i-1][1],d[i-1][2]); d[i][1]=list[i].g+min(d[i-1][0],d[i-1][2]); d[i][2]=list[i].b+min(d[i-1][0],d[i-1][1]); } System.out.println(min(min(d[n][0],d[n][1]),d[n][2])); } public static int min(int a,int b){ if(a<b){ return a; } return b; } } //3가지 색 저장할 클래스 class RGB{ int r; int g; int b; RGB(int _r, int _g, int _b){ r=_r; g=_g; b=_b; } } | cs |
C++
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 35 36 | #include <iostream> using namespace std; int min(int a, int b) { if (a < b) { return a; } return b; } int main() { int n; int d[1001][3]; int a[1001][3]; cin >> n; for (int i = 0; i < n; i++) { int r, g, b; cin >> r >> g >> b; a[i][0] = r; a[i][1] = g; a[i][2] = b; } d[0][0] = a[0][0]; d[0][1] = a[0][1]; d[0][2] = a[0][2]; for (int i = 1; i < n; i++) { d[i][0] = a[i][0] + min(d[i - 1][1], d[i - 1][2]); d[i][1] = a[i][1] + min(d[i - 1][0], d[i - 1][2]); d[i][2] = a[i][2] + min(d[i - 1][0], d[i - 1][1]); } cout << min(d[n - 1][2], min(d[n - 1][0], d[n - 1][1])) << endl; } | cs |
'BOJ::문제풀이' 카테고리의 다른 글
1157 단어 공부 (0) | 2017.12.30 |
---|---|
1152 단어의 개수 (0) | 2017.12.30 |
1065 한수 (0) | 2017.12.30 |
1049 기타줄 (0) | 2017.12.30 |
1012 유기농배추 (0) | 2017.12.30 |