-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathBOJ_2240.java
More file actions
59 lines (49 loc) · 2.45 KB
/
Copy pathBOJ_2240.java
File metadata and controls
59 lines (49 loc) · 2.45 KB
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
54
55
56
57
58
59
package week03.Unoguna;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BOJ_2240 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
String[] TW = (br.readLine()).split(" ");
int T = Integer.parseInt(TW[0]);
int W = Integer.parseInt(TW[1]);
//dp[w][t]에는 자두가 t번 떨어지는 동안 w번 위치를 바꿨을 때 얻을 수 있는 자두의 최대 개수.
int[][] dp = new int[W + 1][T + 1];
//t=0인 경우 자두가 한번도 떨어지지 않았기 때문에 + index가 -1이 되기 때문에 고려X
for(int t = 1; t <= T; t++){
int drop_idx = Integer.parseInt(br.readLine());
//w=0인 경우는 index가 -1이 될 수 있기 때문에 따로 계산
if(drop_idx == 1) dp[0][t] = dp[0][t - 1] + 1; //1번 나무에 자두가 떨어짐
else dp[0][t] = dp[0][t-1]; //2번 나무에 자두가 떨어짐
//자두가 t번 떨어졌을 때 자두는 최대 min(t, W)번 움직일 수 있다.
int max_w=Math.min(t, W);
for(int w = 1; w <= max_w; w++){
//점화식
if(drop_idx == 1){ //1번 나무에 자두가 떨어짐
if(w%2 == 0){ //자두의 현재 위치에 자두가 떨어질 때
dp[w][t] = Math.max(dp[w][t-1], dp[w-1][t-1]) + 1;
}
else{ //현재 위치에 자두가 떨어지지 않았을 때
dp[w][t] = Math.max(dp[w][t-1], dp[w-1][t-1]);
}
}
else{ //2번 나무에 자두가 떨어짐
if(w%2 == 1){ //자두의 현재 위치에 자두가 떨어질 때
dp[w][t] = Math.max(dp[w][t-1], dp[w-1][t-1]) + 1;
}
else{ //현재 위치에 자두가 떨어지지 않았을 때
dp[w][t] = Math.max(dp[w][t-1], dp[w-1][t-1]);
}
}
}
}
//자두가 다 떨어졌을 때 얻을 수 있는 자두의 최대 개수 계산
int answer = 0;
for(int w=0; w<W+1; w++){
answer = Math.max(answer, dp[w][T]);
}
System.out.println(answer);
}
}