트리 dp Anniversary party(HDU1520)
1888 단어 part
분석: 각 점에 대해 두 가지 상태를 선택하거나 선택하지 않으면 상태 수조 dp[u][0]와 dp[u][1]로 현재 u노드가 뿌리 노드의 서브트리로서 변점 u를 선택하면 상태 방정식은 다음과 같다.
dp[u][1]=max(dp[u][1],dp[u][1]+dp[v][0]);선택하지 않으면 방정식은 dp[u][0]=dp[u][0]+max(dp[v][0], dp[v][1])이다.
프로그램:
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
#include"algorithm"
#include"math.h"
#define M 6009
#define inf 0x3f3f3f3f
#define eps 1e-10
using namespace std;
struct node
{
int u,v,w,next;
}edge[M*2];
int t,head[M],p[M],dp[M][3],degree[M];
void init()
{
t=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v)
{
edge[t].u=u;
edge[t].v=v;
edge[t].next=head[u];
head[u]=t++;
}
void dfs(int u,int f)
{
dp[u][0]=0;
dp[u][1]=p[u];
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
if(v==f)continue;
dfs(v,f);
dp[u][0]=dp[u][0]+max(dp[v][0],dp[v][1]);
dp[u][1]=max(dp[u][1],dp[u][1]+dp[v][0]);
}
}
int main()
{
int n,i,a,b;
while(scanf("%d",&n)!=-1)
{
for(i=1;i<=n;i++)
scanf("%d",&p[i]);
init();
memset(degree,0,sizeof(degree));
while(1)
{
scanf("%d%d",&a,&b);
if(!a&&!b)break;
add(b,a);
degree[a]++;
}
int root;
for(i=1;i<=n;i++)
{
if(degree[i]==0)
{
root=i;
break;
}
}
dfs(root,root);
//for(i=1;i<=n;i++)
//printf("%d: %d %d
",i,dp[i][0],dp[i][1]);
printf("%d
",max(dp[root][0],dp[root][1]));
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
POJ 3268 Silver Cow Party(최단락)Silver Cow Party One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow p...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.