https://www.acmicpc.net/problem/1949

아 이건 조금 복잡한데 궁금한사람 없으면 설명충등판 안할랭



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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <stdio.h>
#include <vector>
using namespace std;
 
vector<int> list[10001];
int people[10001];
int cash[10001][2];
 
int max(int a, int b)
{
    return a > b ? a : b;
}
 
int makeans(int from, bool fromstat, int now)
{
    int& ret = cash[now][fromstat];
 
    if (ret != -1)
    {
        return ret;
    }
 
    if (fromstat)
    {
        ret = 0;
        for (int i = 0; i < list[now].size(); i++)
        {
            if (list[now][i] != from)
            {
                ret += makeans(now, false, list[now][i]);
            }
        }
 
    }
    else
    {
        ret = people[now];
        int ret2 = 0;
        for (int i = 0; i < list[now].size(); i++)
        {
            if (list[now][i] != from)
            {
                ret += makeans(now, true, list[now][i]);
                ret2 += makeans(now, false, list[now][i]);
            }
        }
        ret = max(ret, ret2);
    }
 
    return ret;
}
 
int main()
{
    int n;
 
    scanf("%d", &n);
 
    for (int i = 1; i <= n; i++)
    {
        scanf(" %d", &people[i]);
    }
 
    n--;
    while (n--)
    {
        int dummy1, dummy2;
        scanf(" %d %d", &dummy1, &dummy2);
        list[dummy1].push_back(dummy2);
        list[dummy2].push_back(dummy1);
    }
 
    for (int i = 0; i <= 10000; i++)
    {
        cash[i][0= -1;
        cash[i][1= -1;
    }
 
    printf("%d",makeans(0,0,1));
 
    return 0;
}
cs


어차피 같이 푸는 사람도 없고 나혼자 한문제 정해서 그냥 찌그러져서 자기전까지 풀어야겠다