码迷,mamicode.com
首页 > 其他好文 > 详细

清北学堂模拟赛d7t3 天上掉馅饼

时间:2017-10-08 20:34:36      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:namespace   期望值   题目   clu   注意   ==   输入   怎么办   相同   

题目描述
G 进入了一个神奇的世界,在这个世界,天上会掉下一些馅饼。今天,天上
会随机掉下 k 个馅饼。
每次天上掉下馅饼,小 G 可以选择吃或者不吃(必须在下一个馅饼掉下来之前
作出选择,并且现在决定不吃的话以后也不能吃)。
馅饼有 n 种不同的馅,根据物理定律,天上掉下这 n 种馅饼的概率相同且相互
独立。然而,每一种馅饼 i 都有一个前提馅饼集合 Si。只有当 Si 中的馅饼都吃过
之后,才能吃第 i 种馅饼。比如说,韭菜馅馅饼的 S 中有白菜猪肉馅饼和鲜虾馅饼,
那么小 G 只有在吃过白菜猪肉馅饼和鲜虾馅饼之后,才能吃韭菜馅的馅饼。
同时,每个馅饼还有一个美味值 Pi。今天一天小 G 的幸福度,等于小 G 吃到
的所有馅饼的美味值之和。注意,Pi 可能是负数。
现在考虑,在采用最优策略的前提下,小 G 这一天期望的幸福度是多少?
输入格式
第一行两个正整数 k n,表示馅饼的数量和种类。
以下 n 行,每行若干个数,描述一种馅饼。其中第一个数代表美味值,随后的
整数表示该馅饼的前提馅饼,以 0 结尾。
输出格式
输出一个实数,保留 6 位小数,即在最优策略下期望的幸福度。
样例输入 1
1 2
1 0
2 0
样例输出 1
1.500000
数据范围
对于 20% 的数据,所有的馅饼都没有“前提馅饼”
对于 50% 的数据,1 k 101 n 10
对于 100% 的数据,1 k 1001 n 15,美味度为属于 [-10^6; 10^6] 的整数
分析:显然是一道状压dp的题,设f[i][j]为掉落的前i个馅饼中,吃了状态为j的幸福度,当前馅饼i能不能吃取决于状态j是不是i的前提馅饼集合的子集.但是这样并不好维护,我们不知道状态j是否合法.对于这类前面状态约束后面的转移,我们要采用倒着递推的方式来处理.

      f[i][j] = max(f[i + 1][j | (1 << (l - 1))] + p[l],f[i + 1][j]).其中l为当前吃的馅饼种类,p为馅饼的幸福度.这样我们从一个已知的合法状态转移到了前面的合法状态.

      但是题目要求期望值怎么办呢?期望值实际上就是加权平均值,算一下每一次吃馅饼每一种馅饼掉落的概率,对于第一次吃馅饼,每一种馅饼掉落的概率是1/n,第二次吃馅饼,概率是(1/n) ^ 2,以此类推,所以在转移的时候f[i][j] /= n就可以了.

前面状态约束后面的转移,我们要采用倒着递推的方式来处理!

 

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int k, n, p[20], stu[(1 << 15) + 10];
double f[110][(1 << 15) + 10];

int main()
{
    scanf("%d%d", &k, &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &p[i]);
        int x;
        while (scanf("%d", &x) && x != 0)
            stu[i] |= (1 << (x - 1));
    }
    for (int i = k; i >= 1; i--)
        for (int j = 0; j < (1 << n); j++)
        {
        for (int l = 1; l <= n; l++)
            if ((stu[l] & j) == stu[l])
            f[i][j] += max(f[i + 1][j], f[i + 1][j | (1 << (l - 1))] + p[l]);
            else
                f[i][j] += f[i + 1][j];
        f[i][j] /= n;
        }
    printf("%.6lf\n", f[1][0]);

    return 0;
}

 

清北学堂模拟赛d7t3 天上掉馅饼

标签:namespace   期望值   题目   clu   注意   ==   输入   怎么办   相同   

原文地址:http://www.cnblogs.com/zbtrs/p/7638311.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!