HDU 1520:Anniversary party 树形DP基础
Posted kiuhghcsc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU 1520:Anniversary party 树形DP基础相关的知识,希望对你有一定的参考价值。
Anniversary party
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1520
题意:
公司里有一堆人再开派对,每个人有一个欢乐值,这些人之间有一些上下级关系,每个人都不想和他的直接上司(即是父亲,不包括祖先)同时出现在party上,求party上最大的欢乐值的合。
题解:
由题意知公司成员之间可以组成一棵关系树,设value[x]为以x为根节点的子树的最大权值合,child[x]为x的子节点,从树上可以看出,value[x]=max(value[x]+∑value[child[child[x]]],∑value[child[x]])
代码
#include<stdio.h>
#include<string.h>
const int N=20;
double dp[1<<N],p[N],x;
int main()
{
int n;
while(~scanf("%d",&n))
{
dp[(1<<n)-1]=0.0;
for(int i=0;i<n;++i)
scanf("%lf",&p[i]);
for(int j=(1<<n)-2;j>=0;--j)
{
x=0;dp[j]=0.0;
for(int k=0;k<n;++k)
{
if(!((1<<k)&j))
dp[j]+=dp[j+(1<<k)]*p[k],x+=p[k];
}
dp[j]=(dp[j]+1.0)/x;
}
printf("%.5f\n",dp[0]);
}
}
以上是关于HDU 1520:Anniversary party 树形DP基础的主要内容,如果未能解决你的问题,请参考以下文章
HDU-1520 Anniversary party (树形DP)
HDU - 1520 Anniversary party (有向入门树形DP)
HDU1520 Anniversary party 树形DP基础