반응형
문제
N개의 마을로 이루어진 나라가 있다. 편의상 마을에는 1부터 N까지 번호가 붙어 있다고 하자. 이 나라는 트리(Tree) 구조로 이루어져 있다. 즉 마을과 마을 사이를 직접 잇는 N-1개의 길이 있으며, 각 길은 방향성이 없어서 A번 마을에서 B번 마을로 갈 수 있다면 B번 마을에서 A번 마을로 갈 수 있다. 또, 모든 마을은 연결되어 있다. 두 마을 사이에 직접 잇는 길이 있을 때, 두 마을이 인접해 있다고 한다.
이 나라의 주민들에게 성취감을 높여 주기 위해, 다음 세 가지 조건을 만족하면서 N개의 마을 중 몇 개의 마을을 '우수 마을'로 선정하려고 한다.
- '우수 마을'로 선정된 마을 주민 수의 총 합을 최대로 해야 한다.
- 마을 사이의 충돌을 방지하기 위해서, 만일 두 마을이 인접해 있으면 두 마을을 모두 '우수 마을'로 선정할 수는 없다. 즉 '우수 마을'끼리는 서로 인접해 있을 수 없다.
- 선정되지 못한 마을에 경각심을 불러일으키기 위해서, '우수 마을'로 선정되지 못한 마을은 적어도 하나의 '우수 마을'과는 인접해 있어야 한다.
각 마을 주민 수와 마을 사이의 길에 대한 정보가 주어졌을 때, 주어진 조건을 만족하도록 '우수 마을'을 선정하는 프로그램을 작성하시오.
입력
첫째 줄에 정수 N이 주어진다. (1≤N≤10,000) 둘째 줄에는 마을 주민 수를 나타내는 N개의 자연수가 빈칸을 사이에 두고 주어진다. 1번 마을부터 N번 마을까지 순서대로 주어지며, 주민 수는 10,000 이하이다. 셋째 줄부터 N-1개 줄에 걸쳐서 인접한 두 마을의 번호가 빈칸을 사이에 두고 주어진다.
출력
첫째 줄에 '우수 마을'의 주민 수의 총 합을 출력한다.
3번째 조건은 따로 조건 처리할 필요없이 현재 마을이 속하지 않을때 max를 통해 얻는 과정에서 걸러지므로 신경쓰지 않아도 된다.
#include <iostream>
#include<vector>
#include <algorithm>
#include<cmath>
#include<queue>
using namespace std;
vector<int> edge[10001];
vector<int> ans;
int cost[10001];
int dp[10001][2]; //1 => 해당 정점 포함 , 0 = > 미포함
int N;
int solution(int prev, int cur, int state)
{
if (dp[cur][state] != -1)
{
return dp[cur][state];
}
if (state)
dp[cur][state] = cost[cur];
else
dp[cur][state] = 0;
for (int i = 0; i < edge[cur].size(); i++)
{
int next = edge[cur][i];
if (prev == next)
continue;
if (state)
dp[cur][state] += solution(cur, next, 0);
else
dp[cur][state] += max(solution(cur, next, 1), solution(cur, next, 0));
}
return dp[cur][state];
}
int main() {
cin >> N;
for (int i = 1; i <= N; i++)
{
cin >> cost[i];
dp[i][0] = -1;
dp[i][1] = -1;
}
for (int i = 1; i <= N - 1; i++)
{
int a, b;
cin >> a >> b;
edge[a].push_back(b);
edge[b].push_back(a);
}
int temp1 = solution(-1, 1, 1);
int temp2 = solution(-1, 1, 0);
cout << max(temp1, temp2) << "\n";
}
반응형
'Algorithm' 카테고리의 다른 글
[수학 4 단계] 백준 2166번 다각형의 면적 (0) | 2020.10.11 |
---|---|
[트리에서의 동적 계획법 단계] 백준 2533번 사회망 서비스(SNS) (0) | 2020.10.10 |
[트리에서의 동적 계획법 단계] 백준 2231번 트리와 독립집합 (0) | 2020.10.10 |
[트리에서의 동적 계획법 단계] 백준 15681번 트리와 쿼리 (0) | 2020.10.10 |
[최소 신장 트리 단계] 백준 1774번 우주신과의 교감 (0) | 2020.10.09 |