알고리즘
백준 1949번 우수마을 (JAVA)
박카스마시며코딩
2022. 1. 19. 17:28
https://www.acmicpc.net/problem/1949
1949번: 우수 마을
첫째 줄에 정수 N이 주어진다. (1 ≤ N ≤ 10,000) 둘째 줄에는 마을 주민 수를 나타내는 N개의 자연수가 빈칸을 사이에 두고 주어진다. 1번 마을부터 N번 마을까지 순서대로 주어지며, 주민 수는 10,00
www.acmicpc.net
저는 해당 문제를 DP를 이용하여 문제를 해결하였습니다.
dp[node번호][0] : node번호를 우수마을로 선정하지 않을 때의 최대 우수 마을 인원 수
dp[node번호][1] : node번호를 우수마을로 선정했을때의 최대 우수 마을 인원 수
package BOJ.DP;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_1949 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(st.nextToken());
int[] amount = new int[n+1];
List<Integer>[] map = new ArrayList[n+1];
st = new StringTokenizer(br.readLine()," ");
for(int i = 1 ; i <= n ; i++){
map[i] = new ArrayList<>();
amount[i] = stoi.apply(st.nextToken());
}
for(int i = 0 ; i < n-1 ; i++){
st = new StringTokenizer(br.readLine()," ");
int a = stoi.apply(st.nextToken());
int b = stoi.apply(st.nextToken());
map[a].add(b);
map[b].add(a);
}
int [][] dp = new int[n+1][2]; // 1 = 우수 마을
boolean[] visited = new boolean[n+1];
dfs(map,dp,1,visited,n,amount);
int result = Math.max(dp[1][0],dp[1][1]);
System.out.println(result);
}
private static void dfs(List<Integer>[] map, int[][] dp, int now,boolean[]visited, int n,int[] amount) {
// System.out.println(now);
visited[now] = true;
dp[now][1] = amount[now];
dp[now][0] = 0;
for(int i = 0 ; i < map[now].size() ; i++){
int next = map[now].get(i);
if(visited[next]){
continue;
}
dfs(map,dp,next,visited,n,amount);
dp[now][0] += Math.max(dp[next][1],dp[next][0]);
dp[now][1] += dp[next][0];
}
}
}