HDU - 1502 Anniversary party [트리 dp 시작]
5375 단어 트리
그래서 노크를 시작할 수 있습니다. 디테일을 잘 처리하면 됩니다. 구체적인 처리는 코드를 보십시오.
AC Code
const int maxn = 6e3+5;
int dp[maxn][2];
vector<int>g[maxn];
void dfs(int u,int fa)
{
for(int i=0;iint to = g[u][i];
if(to == fa) continue;
dfs(to,u);
}
int len = g[u].size(); // , , .
for(int i=0;i 1 || fa == -1);i++){
int to = g[u][i];
if(fa == to) continue;
dp[u][1] += dp[to][0];
dp[u][0] += max(dp[to][0],dp[to][1]);
}
}
void solve()
{
int n;
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++) g[i].clear();
Fill(dp,0);
for(int i=1;i<=n;i++) scanf("%d",&dp[i][1]);
int u,v;
while(~scanf("%d%d",&u,&v) && u && v){
g[u].push_back(v);
g[v].push_back(u);
}
dfs(1,-1);
printf("%d
",max(dp[1][1],dp[1][0]));
}
}
이것은 나무형 dp의 시작이라고 할 수 있죠. 여기서 사나이가 말한 고전적인 나무형 dp의 제목을 참고해 봤는데...
몇 가지 대표적인 질문을 열거해 보세요.
1: 나무 한 그루의 각 노드에 권한을 부여하여 부모 노드와 하위 노드가 동시에 얻을 수 있는 최대치를 구하지 못하도록 요구한다(hdu1520)
2: 나무 한 그루를 주고 각 노드에서 가장 먼 점의 거리를 구한다(hdu2196)
3:1>한 지도에 N개의 성이 있고, 각 성마다 일정한 보물이 있으며, 매 게임마다 M개의 성을 공략하여 안에 있는 보물을 획득할 수 있습니다.그러나 지리적 위치 때문에 일부 성곽은 직접 공략할 수 없기 때문에 이 성곽을 공략하려면 반드시 다른 특정한 성곽을 먼저 공략해야 한다.최대한 많은 보물을 구하려면 어느 M개의 성곽을 공략해야 합니다.(hdu1561)
문제풀이: 트리 dp+가방 2>각 노드에는 두 개의 값 버그와brain이 있습니다. 이 노드의 모든 버그를 청소할 때brain값을 받습니다. 부 노드가 비워질 때만 하위 노드를 청소할 수 있습니다. 청소는 일정한 인원이 필요합니다.M명, N개의 결점 트리를 정하고 최대 브레인과 (hdu1011)를 구한다.
3>현재 n개의 마을이 있습니다. m개의 마을을 매수하여 당신을 위해 투표를 하려고 합니다. 그 중에서 i번째 마을을 매수하는 대가는val[i]입니다.그러나 일부 마을은 종속관계가 있는데 B가 A국에 종속되면 A를 매수한 것도 B를 매수했다는 뜻이고 이런 관계는 전달된 것이다.-- 최소한 치러야 할 대가는 얼마인가.(poj3345)
4:1>나무 한 그루, 각 노드의 balance 값을 정의합니다. 이 노드를 제거한 숲의 모든 나무의 최대 노드 수입니다.최소 balance 값과 대응하는 노드 번호를 구합니다 (poj1655)
2>무방향 나무 T를 드립니다. 나무의 어떤 결점을 차례대로 제거하고, 그 결점을 제거한 후 숲 T'의 최대 지점을 구하세요.그리고 이 지점은 제거된 결점을 최대한 적게 요구한다.답이 여러 개 있을 수 있으므로 노드 번호에 따라 작은 출력(poj3107)
5:나무 한 그루에 n결점<=1000,K<=200을 주고 이 나무에서 크기가 k인 자수를 찾아 점권과 값을 최대로 한다(zoj3201)
6:나무그림에 점이 n개 있습니다.어느 점을 없애고 나머지 모든 연결자 그림의 점의 수량이 n/2를 초과하지 않도록 구하세요.이런 점이 많으면 오름차순으로 출력한다.n<=10000 (poj2378)
7:n개의 결점을 가진 뿌리 없는 나무에서 한 변을 삭제하여 남은 두 그루의 노드 값의 합을 절대값으로 최소화하고 얻은 최소 절대값(poj3140)을 구한다.
8: 약간의 점, 값, 약간의 변을 제시한 다음에 한 변을 제거한 후 연결된 두 부분으로 나누고 두 부분의 차이가 가장 적다(hdu2242)
9:n개의 점이 하나의 나무를 구성하고 최소한 몇 개의 변을 삭제해야 p개의 결점이 있는 자수 한 그루를 얻을 수 있는지 묻는다(poj1947)
10:나무 n<=1000(노드의 분지<=8), Snail은 뿌리에 있다. Snail은 어느 잎에 있는 house를 찾아야 한다. 그 중 일부 노드에worm이 있다. worm은 이 나무에서 Snail이 가장 빨리 house가 지나간 경로의 기대치를 찾을 수 있는지 알려준다(poj2057)
11:사과나무 하나 줄게요.N개의 노드가 있어요.노드마다 사과가 하나씩 있어요.즉 하나의 권한이 있어요.당신이 이 노드를 지나가면 이 권한을 얻을 수 있어요.반복해서 노드를 걷는 것은 한 번만 계산할 수 있어요.N-1개의 테두리를 줄게요.K걸음만 걸어서 얻을 수 있는 최대 권한과(poj2486)
12:두 갈래 사과나무에 사과가 맺히면 몇 그루의 가지를 잘라내고 Q개의 가지가 사과수까지 보존할 수 있도록 요구한다(ural1018)
13: 나무 한 그루를 정하고 최소한 몇 개의 변을 연결하여 각 점이 하나의 고리 안에 있도록 한다.(poj1848)
14: 나무 모양의 도시에 소방소를 세우지만 도시마다 최대 거리 제한이 있어 필요한 최소 비용을 구한다(poj2152)
위의 문제는 모두 푸는 것이 좋겠다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[BOJ] 2233번: 사과나무 (Java)~트리는 어렵다!!!!!!!!!!!!!!!!!~ 전체 로직 1. parent 배열과 root 배열 채우기 Stack을 이용하여 트리 만들기 이진 배열을 비교하며 삭제하고자 하는 노드의 '실제 인덱스' 구하기 2. 가...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.