zoukankan      html  css  js  c++  java
  • 清北学堂模拟赛d7t3 天上掉馅饼

    题目描述
    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
    ", f[1][0]);
    
        return 0;
    }
  • 相关阅读:
    IDEA下Git分支开发
    spring boot+spring security集成以及Druid数据库连接池的问题
    spring boot中的声明式事务管理及编程式事务管理
    odoo10中的邮件提醒
    Odoo10.0中的工作流
    odoo10甘特图gantt view
    odoo10同一模型的不同视图不同群组权限控制
    Odoo10中calendar视图点击事件
    Kettle中配置oracle RAC
    Docker部署Redis集群-小白入门
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7638311.html
Copyright © 2011-2022 走看看