[概率dp] hdu 5378 Leader in Tree Land

题意:

给你一颗以1位根节点的树,我们定义对于每个子树,节点权值最大的权值记为这个子树的权值,为你将1~n放到这个树里

满足最大权值只有k个的组合数是多少。

思路:

我们可以知道以每个节点为子树,且根节点权值最大的概率是多少,不是的概率是多少。

那么其实问题就变成了 我们在n个物品里面,每个物品拿的概率是pi不拿的概率是1-pi

问你拿k个物品的概率是多少

然后最后乘n!就好了。中间计算运用逆元。

代码:

#include"cstdlib"
#include"cstring"
#include"cmath"
#include"cstdio"
#include"queue"
#include"algorithm"
#include"iostream"
#include"stack"
using namespace std;
#define ll __int64
#define N 123456
vector<int>edge[2234];
ll sum[1234],dp[1234][1234];
ll in[1234],mod=1000000007LL;
ll power(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1) ans=(ans*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return ans;
}
void dfs(int x,int f)
{
    int ans=1,lit=edge[x].size();
    for(int i=0; i<lit; i++)
    {
        int v=edge[x][i];
        if(v==f) continue;
        dfs(v,x);
        ans+=sum[v];
    }
    sum[x]=ans;
    return ;
}
int main()
{
    int t,cas=1;
    cin>>t;
    for(int i=1; i<=1234; i++) in[i]=power(i,mod-2); //预处理逆元
    while(t--)
    {
        int n,k;
        scanf("%d%d",&n,&k);
        for(int i=1; i<=n; i++) edge[i].clear();
        for(int i=1; i<n; i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            edge[x].push_back(y);
            edge[y].push_back(x);
        }
        memset(sum,0,sizeof(sum));
        dfs(1,1);
        memset(dp,0,sizeof(dp));
        dp[0][0]=1;
        for(int i=1; i<=n; i++)
        {
            for(int j=0; j<=k; j++)
            {
                if(j>0) dp[i][j]=(dp[i][j]+dp[i-1][j-1]*in[sum[i]])%mod;
                dp[i][j]=(dp[i][j]+(dp[i-1][j]*(sum[i]-1)%mod)*in[sum[i]]%mod)%mod;
            }
        }

        ll ans=1;
        for(int i=1; i<=n; i++) ans=(ans*i)%mod;
        ans*=dp[n][k];
        printf("Case #%d: %I64d\n",cas++,ans%mod);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-24 12:43:52

[概率dp] hdu 5378 Leader in Tree Land的相关文章

hdu 5378 Leader in Tree Land(dp+逆元)

题目链接:hdu 5378 Leader in Tree Land 问题可以理解成N个节点的树,有K个ministers的概率,最后乘上N!.每个节点为ministers的概率即为1 / son(以该节点为根节点的子树包含的节点个数),同样不为ministers的概率为(son-1)/son.所以没有必要考虑树的结构,直接根句子节点的个数转移dp[i][j] dp[i][j] = dp[i-1][j-1] * 1 / son[u] dp[i][j] = dp[i-1][j] * (son[u]-

HDU 5378 Leader in Tree Land(2015 多校第7场 dp)

Leader in Tree Land Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 150    Accepted Submission(s): 54 Problem Description Tree land has  cities, connected by  roads. You can go to any city from

HDU 5378 Leader in Tree Land

可以用求概率的思想来解决这个问题.令以i号节点为根的子树为第i棵子树,设这颗子树恰好有sz[i]个点.那么第i个点是第i棵子树最大值的概率为1/sz[i],不是最大值的概率为(sz[i]-1)/sz[i].现在可以求解恰好有k个最大值的概率. 令dp[i][j]表示考虑编号从1到i的点,其中恰好有j个点是其子树最大值的概率. 很容易得到如下转移方程:dp[i][j]=dp[i-1][j]*(sz[i]-1)/sz[i]+dp[i-1][j-1]/sz[i].这样dp[n][k]就是所有点中恰好有

HDU 5378 Leader in Tree Land 树形背包

链接 题解来源:点击打开链接 题意: 给定n k 下面n-1行给出一棵树. 把数字1-n填到树的节点上. 填完后计算leader节点个数,若这个点是leader,则这个点上填的数>这个点的子树上填的数 问:恰好有k个leader节点的 填涂方案数. 思路: dp[i][j]表示以i点为根的子树 有恰好j个leader的方案数. 如果u 是叶子节点则 dp[u][0] = 0, dp[u][1] = 1; 如果u不是叶子节点: 先不考虑u点能否成为leader,背包一下. 然后考虑u点:若u能成为

HDOJ 5378 Leader in Tree Land 概率DP

方法太屌,只能看一看了..... 可以用求概率的思想来解决这个问题.令以i号节点为根的子树为第i棵子树,设这颗子树恰好有sz[i]个点.那么第i个点是第i棵子树最大值的概率为1/sz[i],不是最大值的概率为(sz[i]-1)/sz[i].现在可以求解恰好有k个最大值的概率. 令dp[i][j]表示考虑编号从1到i的点,其中恰好有j个点是其子树最大值的概率. 很容易得到如下转移方程:dp[i][j]=dp[i-1][j]*(sz[i]-1)/sz[i]+dp[i-1][j-1]/sz[i].这样

[2015hdu多校联赛补题]hdu5378 Leader in Tree Land

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5378 题意:给你一棵n个结点的有根树.因为是有根树,那么每个结点可以指定以它为根的子树(后面讨论的子树都是这个).现在我们把标号从1到n的n个minister派驻到这些结点上面(每个结点派驻一人),并规定任一子树中编号最大的minister 为该子树的领导,问你存在多少个不同的领导 解: 引用官方题解: 可以用求概率的思想来解决这个问题.令以i号节点为根的子树为第i棵子树,设这颗子树恰好有sz[i]

[概率dp] hdu 5001 Walk

题意:n个点(1~n),m条边,走k次,双向边,每次随机走一条路,起点也随机,问不走到各个点的概率是多少. 思路: 概率dp[i][j][k] 前i步 走到j 走不到k的概率. 那么状态转移就是 j能走到的点,传递所有dp[i][j][k]的值乘上概率. 代码: #include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"

[AC自动机+概率dp] hdu 3689 Infinite monkey theorem

题意: 给n个字母,和m次数. 然后输入n个字母出现的概率 然后再给一个目标串str 然后问m次中敲出目标串的概率是多少. 思路: AC自动机+概率dp的简单题. 首先建立trie图,然后就是状态转移了 dp版本: dp三重循环变量次数,节点数,和字母数 代码: #include"cstdlib" #include"cstdio" #include"cstring" #include"cmath" #include"

概率dp HDU 3853

H - LOOPS Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 3853 Appoint description:  System Crawler  (2014-10-22) Description Akemi Homura is a Mahou Shoujo (Puella Magi/Magical Girl). Homura wa