Skip to content

Commit 1094a4d

Browse files
committed
[Gold II] Title: 우수 마을, Time: 204 ms, Memory: 22268 KB -BaekjoonHub
1 parent bf07f97 commit 1094a4d

2 files changed

Lines changed: 40 additions & 48 deletions

File tree

백준/Gold/1949. 우수 마을/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44

55
### 성능 요약
66

7-
메모리: 23340 KB, 시간: 236 ms
7+
메모리: 22268 KB, 시간: 204 ms
88

99
### 분류
1010

1111
다이나믹 프로그래밍, 트리에서의 다이나믹 프로그래밍, 트리
1212

1313
### 제출 일자
1414

15-
2024년 4월 3일 05:51:21
15+
2025년 4월 4일 09:42:51
1616

1717
### 문제 설명
1818

Lines changed: 38 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,60 @@
1-
import java.io.BufferedReader;
2-
import java.io.InputStreamReader;
3-
import java.util.ArrayList;
4-
import java.util.Arrays;
5-
import java.util.StringTokenizer;
1+
import java.io.*;
2+
import java.util.*;
63

74
public class Main {
5+
static List<Integer>[] map;
6+
static int[] p;
7+
static int[][] dp;
88
static int n;
9-
static int[] people;
10-
static int[][] dp; // dp[i][0]: 선택했을 때 최대 값, dp[i][1]: 선택하지 않았을 때의 최대 값
11-
static ArrayList<Integer>[] graph;
129
static StringTokenizer st;
1310
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
1411
public static void main(String[] args) throws Exception{
15-
input();
16-
dfs(1, 0);
17-
18-
System.out.println(Math.max(dp[1][0], dp[1][1]));
19-
12+
inputSetting();
13+
System.out.println(recur(0, 0, 0));
2014
}
2115

16+
static int recur(int now, int pre, int preflag){
17+
if(dp[now][preflag] != -1) return dp[now][preflag];
2218

23-
public static void dfs(int now, int pre){
19+
int next, rot;
20+
dp[now][preflag] = 0;
21+
for(int i = 0; i < map[now].size(); i++){
22+
next = map[now].get(i);
23+
rot = 0;
2424

25-
int next;
26-
for (int i = 0; i < graph[now].size(); i++) {
27-
next = graph[now].get(i);
2825
if(next == pre) continue;
26+
if(preflag == 0) rot = recur(next, now, 1) + p[next];
27+
rot = Math.max(rot, recur(next, now, 0));
2928

30-
31-
dfs(next, now);
32-
33-
//현재 마을이 우수 마을인 경우, dp[now][0]
34-
dp[now][0] += dp[next][1]; //뒷 동네는 우수 마을 불가능
35-
36-
//현재 마을이 우수 마을이 아닌 경우
37-
dp[now][1] += Math.max(dp[next][0], dp[next][1]); //뒷 동네 우수 마을 가능
29+
dp[now][preflag]+= rot;
3830
}
39-
dp[now][0] += people[now];
31+
return dp[now][preflag];
4032
}
4133

42-
public static void strToken() throws Exception{
34+
static void inputSetting() throws Exception{
35+
n = Integer.parseInt(br.readLine());
36+
map = new ArrayList[n + 1];
37+
p = new int[n + 1];
38+
dp = new int[n + 1][2];
39+
4340
st = new StringTokenizer(br.readLine());
44-
}
45-
public static void input() throws Exception{
46-
strToken();
47-
n = Integer.parseInt(st.nextToken());
41+
for(int i = 0; i < n + 1; i++){
42+
map[i] = new ArrayList<>();
43+
if(i != 0) p[i] = Integer.parseInt(st.nextToken());
4844

49-
people = new int[n + 1];
50-
dp = new int[n + 1][2];
51-
graph = new ArrayList[n + 1];
52-
strToken();
53-
for (int i = 1; i < n + 1; i++) {
54-
graph[i] = new ArrayList<>();
55-
people[i] = Integer.parseInt(st.nextToken());
45+
Arrays.fill(dp[i], -1);
5646
}
5747

58-
int n1, n2;
59-
for (int i = 0; i < n - 1; i++) {
60-
strToken();
61-
n1 = Integer.parseInt(st.nextToken());
62-
n2 = Integer.parseInt(st.nextToken());
63-
graph[n1].add(n2);
64-
graph[n2].add(n1);
48+
int a, b;
49+
for(int i = 0; i < n - 1; i++){
50+
st = new StringTokenizer(br.readLine());
51+
52+
a = Integer.parseInt(st.nextToken());
53+
b = Integer.parseInt(st.nextToken());
54+
map[a].add(b);
55+
map[b].add(a);
6556
}
57+
map[0].add(1);
58+
map[1].add(0);
6659
}
67-
6860
}

0 commit comments

Comments
 (0)