J. Leader in Tree Land

#include <iostream>

using namespace std;
int cas,t = 1,road[1001][1001],n,k,ra,rb,size[1001];
long long sum,dp[1001][1001];       //dp[i][j]表示从1到i节点有j个节点是其字数的最大值
void init()
{
    int i,j;
    sum = 1;
    for(i = 1;i <= n;i ++)
    {
        sum = (sum*i)%1000000007;
        size[i] = 1;
        for(j = 1;j <= n;j ++)
            dp[i][j] = road[i][j] = 0;
    }
}
void LookRoad(int r)
{
    int i;
    for(i = 1;i <= n;i ++)
    {
        if(road[r][i])
        {
            road[r][i] = road[i][r] = 0;
            LookRoad(i);
            size[r] += size[i];
        }
    }
}
int main()
{
    cin >> cas;
    while(cas --)
    {
        cin >> n >> k;
        init();
        for(int i = 1;i < n;i ++)
        {
            cin >> ra >> rb;
            road[ra][rb] = road[rb][ra] = 1;
        }
        LookRoad(1);
        dp[1][0] = ((n-1)*sum)/n;
        dp[1][1] = sum/n;
        for(int i = 2;i <= n;i ++)
        {
            for(int j = 0;j <= i;j ++)
            {
                if(j > 0)
                    dp[i][j] = dp[i-1][j-1]/size[i] + (dp[i-1][j]*(size[i]-1))/size[i];
                else
                    dp[i][0] = (dp[i-1][0] *(size[i]-1))/size[i];
            }
        }
        cout << "case #" << t ++ << ": " << dp[n][k] << endl;
    }
    return 0;
}
时间: 2024-10-27 06:30:33

J. Leader in Tree Land的相关文章

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].这样

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]-

[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]

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(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 树形背包

链接 题解来源:点击打开链接 题意: 给定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能成为

[概率dp] hdu 5378 Leader in Tree Land

题意: 给你一颗以1位根节点的树,我们定义对于每个子树,节点权值最大的权值记为这个子树的权值,为你将1~n放到这个树里 满足最大权值只有k个的组合数是多少. 思路: 我们可以知道以每个节点为子树,且根节点权值最大的概率是多少,不是的概率是多少. 那么其实问题就变成了 我们在n个物品里面,每个物品拿的概率是pi不拿的概率是1-pi 问你拿k个物品的概率是多少 然后最后乘n!就好了.中间计算运用逆元. 代码: #include"cstdlib" #include"cstring&

Google interview question: k-nearest neighbor (k-d tree)

Question: You are given information about hotels in a country/city. X and Y coordinates of each hotel are known. You need to suggest the list of nearest hotels to a user who is querying from a particular point (X and Y coordinates of the user are giv

HDU3333 Turing Tree(线段树)

题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=3333 Description After inventing Turing Tree, 3xian always felt boring when solving problems about intervals, because Turing Tree could easily have the solution. As well, wily 3xian made lots of new