Skip to content

Commit 913c32d

Browse files
committed
[Gold I] Title: 그림 교환, Time: 204 ms, Memory: 44644 KB -BaekjoonHub
1 parent f2cec11 commit 913c32d

2 files changed

Lines changed: 82 additions & 0 deletions

File tree

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# [Gold I] 그림 교환 - 1029
2+
3+
[문제 링크](https://www.acmicpc.net/problem/1029)
4+
5+
### 성능 요약
6+
7+
메모리: 44644 KB, 시간: 204 ms
8+
9+
### 분류
10+
11+
비트마스킹, 다이나믹 프로그래밍, 비트필드를 이용한 다이나믹 프로그래밍
12+
13+
### 제출 일자
14+
15+
2024년 12월 1일 16:35:14
16+
17+
### 문제 설명
18+
19+
<p>예술을 사랑하는 사람들이 시장에 모여서 그들의 그림을 서로 거래하려고 한다. 모든 그림의 거래는 다음과 같은 조건을 만족해야 한다.</p>
20+
21+
<ol>
22+
<li>그림을 팔 때, 그림을 산 가격보다 크거나 같은 가격으로 팔아야 한다.</li>
23+
<li>같은 그림을 두 번 이상 사는 것은 불가능하다.</li>
24+
</ol>
25+
26+
<p>방금 시장에 새로운 그림이 들어왔다. 1번 아티스트는 그 그림을 외부 상인에게 가격 0을 주고 샀다. 이제 그 그림을 자신의 예술가 친구들에게 팔려고 한다. 위의 조건을 모두 만족하는 거래만 이루어진다고 가정했을 때, 그림을 소유했던 사람의 수의 최댓값을 출력하는 프로그램을 작성하시오. (1번 아티스트와 마지막으로 그 그림을 소유한 사람도 포함한다).</p>
27+
28+
### 입력
29+
30+
<p>첫째 줄에 예술가의 수 N이 주어진다. N은 2보다 크거나 같고, 15보다 작거나 같은 자연수이다.</p>
31+
32+
<p>둘째 줄부터 N개의 줄에는 N개의 수가 주어진다. i번째 줄의 j번째 수는 j번 예술가가 i번 예술가에게 그 그림을 살 때의 가격이다. 모든 가격은 0이 제일 낮은 가격이고, 9가 제일 높은 가격이다.</p>
33+
34+
### 출력
35+
36+
<p>첫째 줄에 그 그림을 소유 했던 사람들 (잠시라도 소유했던 사람도 포함)의 최댓값을 출력한다.</p>
37+
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
public class Main {
5+
static int n;
6+
static int[][] prices;
7+
static int[][][] dp;
8+
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
9+
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
10+
public static void main(String[] args) throws Exception{
11+
pre_setting();
12+
bw.append(String.valueOf(buy(0, 0, 1) + 1));
13+
bw.close();
14+
}
15+
static int buy(int seller, int buy_price, int visited){
16+
if(dp[visited][seller][buy_price] != -1) return dp[visited][seller][buy_price];
17+
18+
int rot = 0;
19+
for(int i = 0; i < n; i++){
20+
if(0 < (visited & (1 << i))) continue;
21+
if(buy_price <= prices[seller][i]) rot = Math.max(buy(i, prices[seller][i], visited | (1 << i)) + 1, rot);
22+
}
23+
// return rot;
24+
return dp[visited][seller][buy_price] = rot;
25+
}
26+
27+
static void pre_setting() throws Exception{
28+
n = Integer.parseInt(br.readLine());
29+
prices = new int[n][n];
30+
dp = new int[1 << n][n][10];
31+
32+
String[] tmp;
33+
for (int i = 0; i < n; i++){
34+
tmp = br.readLine().split("");
35+
36+
for(int j = 0; j < n; j++) prices[i][j] = Integer.parseInt(tmp[j]);
37+
}
38+
39+
for(int i = 0; i < (1 << n); i++){
40+
for (int j = 0; j < n; j++) {
41+
Arrays.fill(dp[i][j], -1);
42+
}
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)