题意:一只蜗牛,它的房子在树上的某个叶子节点上,它要从树的根节点出发,寻找自己的房子。树的任意两个节点的距离为1,房子出现在每个叶子节点上的可能性一样。有的节点上有虫子,如果有虫子,虫子会告诉蜗牛它的房子是不是在这个节点为根的子树上。求蜗牛所走距离的最小期望。

   如下图,如果蜗牛制定的策略先到2,再到5再到4,则由于房子地点的不确定,所以可能走的距离为1,4,6,所以期望为11/3。如果制定的策略是先到3,根据虫子的话判断去4和5还是去2,则可能走的距离为2,4,3,所以期望为9/3 = 3。可以证明,最小的期望即为3。

解法:首先,设叶子节点总数为tt,则肯定会有tt种情况,所以只需要求出所有情况下,找到房子所需要走的距离之和即可。

   设le[x]表示以x为根的子树上叶子节点的个数;

   设su[x]表示在以x为根的子树上,各种情况下找到房子所需走的距离之和;(0为根节点,su[0] / le[0]即为所求)

   设fail[x]表示在以x为根的子树上,遍历整个子树没有找到房子又返回x节点所需要走的距离和。

   则le[x] += le[v[i]],v是x的子节点集合;

   for (int i = 0; i < v.size(); ++ i) { su[x] += (fail[x] + 1) * le[y] + su[y];fail[x] += fail[y] + 2;}(这个状态转移方程很精妙,多体会下,最好画个树手算模拟一下)

tag:树形dp, think, good

 /*
* Author: Plumrain
* Created Time: 2013-11-20 10:39
* File Name: (good)DP-POJ-2057.cpp
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector> using namespace std; #define CLR(x) memset(x, 0, sizeof(x))
#define PB push_back int n;
bool w[];
vector<int> v[];
int le[], fail[], su[]; bool cmp(int x, int y)
{
return (fail[x]+)*le[y] < (fail[y]+)*le[x];
} void init()
{
CLR (le); CLR (fail); CLR (su); CLR (w);
for (int i = ; i < n; ++ i)
v[i].clear(); int t1;
char s[];
for (int i = ; i < n; ++ i){
scanf ("%d%s", &t1, s);
if (s[] == 'Y') w[i] = ;
if (t1 != -) v[t1-].PB(i);
}
} void dfs(int x)
{
if (!v[x].size()){
le[x] = ;
su[x] = ;
fail[x] = ;
return;
} for (int i = ; i < (int)v[x].size(); ++ i){
dfs(v[x][i]);
le[x] += le[v[x][i]];
} sort (v[x].begin(), v[x].end(), cmp);
for (int i = ; i < (int)v[x].size(); ++ i){
int y = v[x][i];
su[x] += (fail[x]+)*le[y] + su[y];
fail[x] += fail[y] + ;
}
if (w[x]) fail[x] = ;
} int main()
{
while (scanf("%d", &n) != EOF && n){
init();
dfs();
printf ("%.4f\n", (double)su[] / le[]);
}
return ;
}

POJ 2057 The Lost House的更多相关文章

  1. poj 2057 树形DP,数学期望

    题目链接:http://poj.org/problem?id=2057 题意:有一只蜗牛爬上树睡着之后从树上掉下来,发现后面的"房子"却丢在了树上面, 现在这只蜗牛要求寻找它的房子 ...

  2. poj 2057 树形dp 贪心

    思路:设sum[i],le[i],back[i],worm[i]分别表示以i为根节点需要的完成步数,叶子节点数,失败回退步数,以及i是否有虫. #include<iostream> #in ...

  3. POJ - 2057 The Lost House(树形DP+贪心)

    https://vjudge.net/problem/POJ-2057 题意 有一只蜗牛爬上某个树枝末睡着之后从树上掉下来,发现后面的"房子"却丢在了树上面,.现在这只蜗牛要求寻找 ...

  4. POJ 2057 The Lost Home 树形dp 难度:2

    The Lost House Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 2203   Accepted: 906 Des ...

  5. POJ 2057 The Lost House [树状DP]

    题意:一只蜗牛将壳忘在了一棵树的某一个末结点(叶子)上.它想找回自己的壳,但忘记是丢在哪个结点上了,只好从树根开始网上爬,一个结点一个结点地找.在一些结点上居住着毛毛虫,它们会告诉蜗牛该结点以及它的子 ...

  6. poj很好很有层次感(转)

    OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 30 ...

  7. POJ题目分类推荐 (很好很有层次感)

    著名题单,最初来源不详.直接来源:http://blog.csdn.net/a1dark/article/details/11714009 OJ上的一些水题(可用来练手和增加自信) (POJ 3299 ...

  8. POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理

    Halloween treats Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7644   Accepted: 2798 ...

  9. POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理

    Find a multiple Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7192   Accepted: 3138   ...

随机推荐

  1. Android EditText自动弹出输入法焦点

    http://mobile.51cto.com/aprogram-403138.htm 1. 看一个manifest中Activity的配置,如果这个页面有EditText,并且我们想要进入这个页面的 ...

  2. (转载)Javascript 进阶 作用域 作用域链

    载请标明出处:http://blog.csdn.net/lmj623565791/article/details/25076713 一直觉得Js很强大,由于长期不写js代码,最近刚好温故温故. 1.J ...

  3. webServices 执行流程,(我是菜鸟,我怕谁,仅代表个人理解,欢迎各位大神们指导,不和您的胃口,请默默离开!!)

    二.上图仅仅代表个人理解,下面以代码方式解释一下. (1) strtus.xml <?xml version="1.0" encoding="UTF-8" ...

  4. 让div 实现 input效果

    <div class="arcils-info" c /> .arcils-info { border: none; width: 100%; font-size: 1 ...

  5. KTV2

    自制KTV点歌系统经验 重唱与切歌 1.重唱 这个简单,会了播放,就会了这个; 我们用的数组下标来确定播放歌曲,自然如果下标没变的话,那播放的就还是这首了.所以只要确定了要执行的命令是重唱就行了. 那 ...

  6. 你好,C++(3)2.1 一个C++程序的自白

    第2部分 与C++第一次亲密接触 在浏览了C++“三分天下”的世界版图之后,便对C++有了基本的了解,算是一只脚跨入了C++世界的大门.那么,怎样将我们的另外一只脚也跨入C++世界的大门呢?是该即刻开 ...

  7. window对象细节(转载)

    Window对象是客户端javascript最高层对象之一,只要打开浏览器窗口,不管该窗口中是否有打开的网页,当遇到BODY.FRAMESET或FRAME元素时,都会自动建立window对象的实例.另 ...

  8. Android 学习手札(备注)

    1.在Android 应用程序中不能使用System.out.println(..)来输出信息,而要使用Log类中的静态方法输出调试信息. Log.d("onStart", &qu ...

  9. [jQuery编程挑战]007 切换数据表格的行列

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="utf-8&quo ...

  10. yii框架基本操作

    <?php namespace app\controllers; use yii\web\Controller; use app\models\DemoForm; use app\models\ ...