标签:
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基础
标签:
原文地址:http://www.cnblogs.com/kiuhghcsc/p/5592028.html