내용으로 건너뛰기
테페리넷
사용자 도구
등록
로그인
사이트 도구
검색
도구
문서 보기
Fold/unfold all
역링크
미디어 관리자
사이트맵
등록
로그인
>
미디어 관리자
사이트맵
현재 위치:
테페리넷
»
Problem Solving
»
문제
»
백준 온라인 저지 (BOJ)
»
대기업 승범이네
ps:problems:boj:17831
이 문서는 읽기 전용입니다. 원본을 볼 수는 있지만 바꿀 수는 없습니다. 문제가 있다고 생각하면 관리자에게 문의하세요.
====== 대기업 승범이네 ====== ===== 풀이 ===== * 트리 DP 문제 * 각 서브트리에 대해서, 가질수 있는 최댓값 (dp[x])와, 루트가 child와 멘토링을 안맺었을때의 최댓값(dp2[x])를 구해놓으면 된다. * 그러면 어떤 트리에 대해서 dp와 dp2값을 서브트리들에 대한 값으로부터 계산하는 것은 아래처럼 된다. * $dp2[root] = \sum_i{dp[i]}$ * $dp[root] = max(dp2[root], max_k(\sum_{i≠k}{dp[i]} + dp2[k] + A[root]*A[k]))$ * 후자는 그냥 저렇게 단순히 계산하면 O(|child|^2)일것 같지만, 아래처럼 바꾸면 O(|child|)이 된다 * $dp[root] = \sum_i{dp[i]} + max(0, max_k(-dp[k] + dp2[k] + A[root]*A[k]))$ * 전체 시간복잡도는 O(n) ===== 코드 ===== <dkpr py> """Solution code for "BOJ 17831. 대기업 승범이네". - Problem link: https://www.acmicpc.net/problem/17831 - Solution link: http://www.teferi.net/ps/problems/boj/17831 Tags: [DP] [DP on Tree] """ from teflib import ttree def main(): def calc_dp(subtree_vals, root): val_without_root = max_inc_with_root = 0 for child, sub_val, sub_val_without_root in subtree_vals: val_without_root += sub_val inc = A[root] * A[child] - sub_val + sub_val_without_root max_inc_with_root = max(max_inc_with_root, inc) return (root, val_without_root + max_inc_with_root, val_without_root) N = int(input()) bosses = [int(x) for x in input().split()] A = [int(x) for x in input().split()] tree = [[] for _ in range(N)] for i, boss in enumerate(bosses, 1): tree[i].append(boss - 1) tree[boss - 1].append(i) print(ttree.dp_on_tree(tree, calc_dp, 0)[1]) if __name__ == '__main__': main() </dkpr> * Dependency: [[:ps:teflib:ttree#dp_on_tree|teflib.ttree.dp_on_tree]] {{tag>BOJ ps:problems:boj:플래티넘_5}}
ps/problems/boj/17831.txt
· 마지막으로 수정됨: 2021/11/05 15:26 저자
teferi
문서 도구
문서 보기
역링크
Fold/unfold all
맨 위로