1) 분할 정복(top-down사용)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int r[];
static int g[];
static int b[];
static int n;
public static void main(String[] args) throws IOException{
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
n=Integer.parseInt(reader.readLine());
r=new int [n];
g=new int [n];
b=new int [n];
for(int i=0;i<n;i++){
StringTokenizer token =new StringTokenizer(reader.readLine());
r[i]=Integer.parseInt(token.nextToken());
g[i]=Integer.parseInt(token.nextToken());
b[i]=Integer.parseInt(token.nextToken());
}
int result=-1;
result=Math.min(solve(0,r), Math.min(solve(0,g), solve(0,b)));
System.out.println(result);
}
static int solve(int index,int[] color){
if(index>=n){
return 0;
}
if(color==r){
return r[index]+Math.min(solve(index+1,g),solve(index+1,b));
}else if(color==g){
return g[index]+Math.min(solve(index+1,r),solve(index+1,b));
}else if(color==b){
return b[index]+Math.min(solve(index+1,r),solve(index+1,g));
}
return 0;
}
}
dp문제인데 dp아직 잘몰라서 맞게 풀었는지 모르겠다...아마 top-down..?(분할정복..?)....에휴
2) DP 사용
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
int n=Integer.parseInt(reader.readLine());
int [][]color=new int[n+1][3];
int [][]cost=new int[n+1][3];
for(int i=1;i<=n;i++){
StringTokenizer token =new StringTokenizer(reader.readLine());
for(int j=0;j<3;j++){
color[i][j]=Integer.parseInt(token.nextToken());
}
}
for(int i=1;i<=n;i++){
//1...n 번집을 red로 색칠 할 경우 최소값
cost[i][0]=Math.min(cost[i-1][1], cost[i-1][2])+color[i][0];
//i=1일때는 그 전값이 합산이 되지 않는다.
cost[i][1]=Math.min(cost[i-1][0], cost[i-1][2])+color[i][1];
//그전의 최소값 코스트 +i집을 그린으로 칠할때 cost
cost[i][2]=Math.min(cost[i-1][0], cost[i-1][1])+color[i][2];
}
int result;
result=Math.min(cost[n][0],Math.min(cost[n][1], cost[n][2]));
System.out.println(result);
}
}
3) 분할 정복 / DP 사용시 메모리사용량 & 시간
'코딩문제' 카테고리의 다른 글
[백준알고리즘] 팩토리얼 0의 개수 (0) | 2018.03.23 |
---|---|
[코드그라운드] 프리랜서 (DP) (0) | 2018.03.23 |
[백준알고리즘] 1로 만들기 (DP) (0) | 2018.03.23 |
[백준알고리즘] 단지번호붙이기 (DFS) (0) | 2018.03.23 |
[백준] 1260 DFS와 BFS (0) | 2017.09.09 |