Skip to content

Commit 10271c3

Browse files
authored
Merge pull request #1598 from AlgorithmWithGod/lkhyun
[20251206] BOJ / G4 / 우유 도시 / 이강현
2 parents 9f7d8d9 + 8f659b6 commit 10271c3

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 class State{
7+
int lastMilk;
8+
int cnt;
9+
State(int lastMilk,int cnt){
10+
this.lastMilk = lastMilk;
11+
this.cnt = cnt;
12+
}
13+
}
14+
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
15+
static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
16+
static StringTokenizer st;
17+
static StringBuilder sb = new StringBuilder();
18+
static int N;
19+
static int[][] stores;
20+
static State[][] dp;
21+
22+
public static void main(String[] args) throws Exception {
23+
N = Integer.parseInt(br.readLine());
24+
stores = new int[N+1][N+1];
25+
26+
for(int i = 1; i<=N; i++){
27+
st = new StringTokenizer(br.readLine());
28+
for(int j = 1; j <= N; j++){
29+
stores[i][j] = Integer.parseInt(st.nextToken());
30+
}
31+
}
32+
33+
dp = new State[N+1][N+1];
34+
35+
if(stores[1][1] == 0){
36+
dp[1][1] = new State(0, 1);
37+
}else{
38+
dp[1][1] = new State(-1, 0);
39+
}
40+
41+
42+
for(int j = 2; j <= N; j++){
43+
int nextMilk = (dp[1][j-1].lastMilk + 1) % 3;
44+
if(dp[1][j-1].lastMilk == -1) nextMilk = 0;
45+
46+
if(stores[1][j] == nextMilk){
47+
dp[1][j] = new State(stores[1][j], dp[1][j-1].cnt + 1);
48+
}else{
49+
dp[1][j] = new State(dp[1][j-1].lastMilk, dp[1][j-1].cnt);
50+
}
51+
}
52+
53+
for(int i = 2; i <= N; i++){
54+
int nextMilk = (dp[i-1][1].lastMilk + 1) % 3;
55+
if(dp[i-1][1].lastMilk == -1) nextMilk = 0;
56+
57+
if(stores[i][1] == nextMilk){
58+
dp[i][1] = new State(stores[i][1], dp[i-1][1].cnt + 1);
59+
}else{
60+
dp[i][1] = new State(dp[i-1][1].lastMilk, dp[i-1][1].cnt);
61+
}
62+
}
63+
64+
for(int i = 2; i<=N;i++){
65+
for(int j = 2; j<=N; j++){
66+
State up = dp[i-1][j];
67+
State left = dp[i][j-1];
68+
69+
int upNextMilk = (up.lastMilk + 1) % 3;
70+
if(up.lastMilk == -1) upNextMilk = 0;
71+
72+
int leftNextMilk = (left.lastMilk + 1) % 3;
73+
if(left.lastMilk == -1) leftNextMilk = 0;
74+
75+
int upCnt = up.cnt + (stores[i][j] == upNextMilk ? 1 : 0);
76+
int leftCnt = left.cnt + (stores[i][j] == leftNextMilk ? 1 : 0);
77+
78+
if(upCnt >= leftCnt){
79+
if(stores[i][j] == upNextMilk){
80+
dp[i][j] = new State(stores[i][j], upCnt);
81+
}else{
82+
dp[i][j] = new State(up.lastMilk, upCnt);
83+
}
84+
}else{
85+
if(stores[i][j] == leftNextMilk){
86+
dp[i][j] = new State(stores[i][j], leftCnt);
87+
}else{
88+
dp[i][j] = new State(left.lastMilk, leftCnt);
89+
}
90+
}
91+
}
92+
}
93+
bw.write(dp[N][N].cnt+"");
94+
bw.close();
95+
}
96+
}
97+
```

0 commit comments

Comments
 (0)