멘토 트리 구조에서 각 구성원이 두 가지 알고리즘 유형을 배우도록 선택해, 모든 팀(한 노드와 그 자식들)이 구성원마다 서로 다른 유형을 하나씩 맡을 수 있게 하면서 총 교육 비용을 최소화한다.
보통7동적 계획법트리그리디비트 연산아직 제출이 없습니다시간 제한2초메모리 제한512 MB알고리즘 스터디는 알고리즘 문제 풀이를 함께 공부하는 모임이다. 이 모임에는 N명이 소속되어 있고, 가입한 순서대로 0번부터 N-1번까지 번호가 매겨져 있다.
0번 회원은 멘토가 없는 유일한 회원이다. 나머지 회원은 모두 멘토를 정확히 한 명 갖는다. i번 회원의 멘토는 Si번 회원이고, 0번 회원은 멘토가 없으므로 S0=−1이다. 멘토는 자신보다 먼저 모임에 들어온 사람이어야 하므로, 1≤i≤N−1인 모든 i에 대해 0≤Si≤i−1이다.
모임의 운영자는 회원 전원에게 알고리즘을 가르치기로 했다. 스터디는 문제 풀이에 쓰이는 알고리즘을 M개의 유형으로 나누고 1번부터 M번까지 번호를 매겨 두었다. i번 유형을 한 사람에게 가르치는 데 드는 비용은 Ti원이다. 회원은 각자 수업을 두 번 들어야 하며, 같은 유형의 수업을 두 번 들을 수는 없다. 교육이 끝나면 회원은 자신이 배운 두 유형에 속하는 문제는 모두 풀 수 있고, 그 두 유형에 속하지 않는 문제는 전혀 풀 수 없다.
회원은 각자 자신이 리더인 팀을 하나씩 만들어야 한다. 따라서 팀은 모두 N개 생긴다. i번 회원이 리더인 팀은 i번 회원과 멘토가 i번인 회원으로 이루어진다. 즉 Sj=i인 모든 j가 이 팀에 속한다. Sk=j이고 Sj=i이면, k는 i번 회원이 리더인 팀에 속하지 않는다.
어떤 팀이 프로그래밍 대회에 참가할 자격을 갖추려면 아래 조건을 만족해야 한다.
자격 검사는 팀마다 따로 한다. 즉 한 사람이 서로 다른 팀에서 서로 다른 유형을 정해도 된다. 참가 자격을 갖춘 팀을 좋은 팀이라고 한다.
모든 팀이 좋은 팀이 되도록 각 회원에게 가르칠 두 유형을 정할 때, 필요한 비용의 최솟값을 구하는 프로그램을 작성하시오.
첫째 줄에 N과 M이 주어진다. (1≤N≤30, 2≤M≤30)
둘째 줄에 S0부터 SN−1까지 N개의 정수가 순서대로 주어진다. (S0=−1, 1≤i≤N−1인 i에 대해 0≤Si≤i−1)
셋째 줄에 T1부터 TM까지 M개의 정수가 순서대로 주어진다. (1≤Ti≤100)
모든 팀이 좋은 팀이 되도록 교육하는 데 필요한 비용의 최솟값을 첫째 줄에 출력한다.
모든 팀을 좋은 팀으로 만들 수 없으면 -1을 출력한다.
팀원이 k명인 팀에서는 k명이 서로 다른 유형을 정해야 한다. 그러므로 그 팀원이 배운 유형을 모두 모으면 서로 다른 유형이 k개 이상이어야 하고, 나아가 팀원마다 유형을 하나씩 겹치지 않게 나누어 가질 수 있어야 한다.
회원이 한 명뿐인 팀은 항상 좋은 팀이다. 모임에 회원이 한 명뿐이면 가장 싼 두 유형을 가르치는 것이 비용이 가장 적다.