-
[문제해결을 위한 창의적 알고리즘] Minimum Sum (고급, p200)알고리즘 2017. 2. 18. 23:09
이 문제는 비트 오퍼레이션을 통해 보다 빠르게 동작하는 방법을 알아보는 문제이다. 역시 동적계획법을 통해 문제를 푸는 방법을 알아본다. 비트 연산을 어떻게 적용하는지 알아두는 것이 핵심이라고 할 수 있겠다.
import java.util.Scanner;
public class MinSumSol205 {
// 최대값 설정
public static final int INF = 987654321;
// 입력 받을 공간
public static int[][] m = new int[21][21];
public static int bit, n;
// 동적 테이블 선언
public static int[] DT = new int[1<<20];
public static void input(){
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
for (int i = 0; i < n; i++)
for (int j = 0; j< n; j++)
m[i][j]=sc.nextInt();
sc.close();
return;
}
public static int min(int a, int b){
return a > b ? b : a;
}
public static int f(int row, int bit){
if (row==n)
return 0;
// 만약 동적 테이블이 한번도 업데이트되지 않았다면
if (DT[bit]==0){
// 최대값으로 업데이트 하고
DT[bit]=INF;
for (int i = 0; i < n; i++)
// 한번도 사용하지 않은 열이면
if ((bit&(1<<i))==0)
// 현재 행의 선택한 열값과 최대값 중 작은 값으로 업데이트 한다
DT[bit]=min(DT[bit], f(row+1, bit+(1<<i))+m[row][i]);
}
return DT[bit];
}
public static void main(String[] args){
input();
System.out.println(f(0,0));
return;
}
}
Big O(n^2)
Github: https://github.com/nevermet/CreativeAlgorithmAdv/blob/master/MinSumSol205.java
'알고리즘' 카테고리의 다른 글
[문제해결을 위한 창의적 알고리즘] 두부 자르기2 (고급, p207) (0) 2017.02.24 [문제해결을 위한 창의적 알고리즘] 두부 자르기 (고급, p207) (0) 2017.02.19 [문제해결을 위한 창의적 알고리즘] 공주 구하기2 (고급, p191) (0) 2017.02.17 [문제해결을 위한 창의적 알고리즘] 공주 구하기 (고급, p191) (0) 2017.02.11 [문제해결을 위한 창의적 알고리즘] 선물 (고급, p178) (0) 2017.02.11