Skip to content

Commit c35192f

Browse files
authored
Merge pull request #1436 from AlgorithmWithGod/lkhyun
[20251117] BOJ / G4 / 서울에서 경산까지 / 이강현
2 parents 2c1ff7e + 1fa2f15 commit c35192f

File tree

1 file changed

+97
-0
lines changed

1 file changed

+97
-0
lines changed
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
```java
2+
import java.util.*;
3+
import java.io.*;
4+
5+
public class Main {
6+
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
7+
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
8+
static StringTokenizer st;
9+
static int N, K;
10+
static int[] vehicleTime, vehiclePrice, walkTime, walkPrice;
11+
static int[] dp;
12+
static boolean[] impossible;
13+
14+
public static void main(String[] args) throws Exception {
15+
st = new StringTokenizer(br.readLine());
16+
N = Integer.parseInt(st.nextToken());
17+
K = Integer.parseInt(st.nextToken());
18+
19+
walkTime = new int[N + 1];
20+
walkPrice = new int[N + 1];
21+
vehicleTime = new int[N + 1];
22+
vehiclePrice = new int[N + 1];
23+
dp = new int[K + 1];
24+
impossible = new boolean[K + 1];
25+
26+
for (int i = 1; i <= N; i++) {
27+
st = new StringTokenizer(br.readLine());
28+
walkTime[i] = Integer.parseInt(st.nextToken());
29+
walkPrice[i] = Integer.parseInt(st.nextToken());
30+
vehicleTime[i] = Integer.parseInt(st.nextToken());
31+
vehiclePrice[i] = Integer.parseInt(st.nextToken());
32+
}
33+
34+
Arrays.fill(impossible, true);
35+
36+
if (walkTime[1] <= K) {
37+
dp[walkTime[1]] = walkPrice[1];
38+
impossible[walkTime[1]] = false;
39+
}
40+
if (vehicleTime[1] <= K) {
41+
if (impossible[vehicleTime[1]]) {
42+
dp[vehicleTime[1]] = vehiclePrice[1];
43+
impossible[vehicleTime[1]] = false;
44+
} else {
45+
dp[vehicleTime[1]] = Math.max(dp[vehicleTime[1]], vehiclePrice[1]);
46+
}
47+
}
48+
49+
for (int i = 2; i <= N; i++) {
50+
boolean[] nextImpossible = new boolean[K + 1];
51+
Arrays.fill(nextImpossible, true);
52+
int[] nextDp = new int[K + 1];
53+
54+
for (int j = K; j >= 0; j--) {
55+
if (impossible[j]) continue;
56+
57+
if (j + walkTime[i] <= K) {
58+
int nextTime = j + walkTime[i];
59+
int nextMoney = dp[j] + walkPrice[i];
60+
61+
if (nextImpossible[nextTime]) {
62+
nextDp[nextTime] = nextMoney;
63+
nextImpossible[nextTime] = false;
64+
} else {
65+
nextDp[nextTime] = Math.max(nextDp[nextTime], nextMoney);
66+
}
67+
}
68+
69+
if (j + vehicleTime[i] <= K) {
70+
int nextTime = j + vehicleTime[i];
71+
int nextMoney = dp[j] + vehiclePrice[i];
72+
73+
if (nextImpossible[nextTime]) {
74+
nextDp[nextTime] = nextMoney;
75+
nextImpossible[nextTime] = false;
76+
} else {
77+
nextDp[nextTime] = Math.max(nextDp[nextTime], nextMoney);
78+
}
79+
}
80+
}
81+
82+
dp = nextDp;
83+
impossible = nextImpossible;
84+
}
85+
86+
int answer = 0;
87+
for (int j = 0; j <= K; j++) {
88+
if (!impossible[j]) {
89+
answer = Math.max(answer, dp[j]);
90+
}
91+
}
92+
93+
bw.write(answer + "");
94+
bw.close();
95+
}
96+
}
97+
```

0 commit comments

Comments
 (0)