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 |
어차피 같이 푸는 사람도 없고 나혼자 한문제 정해서 그냥 찌그러져서 자기전까지 풀어야겠다
1253 해보시라니까
츄라이 츄라이
ㅇㅋ
이분탐색문제같은데