Problem

Description

你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关。

在这个奖励关里,系统将依次随机抛出 \(k\) 次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃)。

宝物一共有n种,系统每次抛出这 \(n\) 种宝物的概率都相同且相互独立。也就是说,即使前 \(k-1\) 次系统都抛出宝物 \(1\)(这种情况是有可能出现的,尽管概率非常小),第 \(k\) 次抛出各个宝物的概率依然均为 \(\frac{1}{n}\)。

获取第 \(i\) 种宝物将得到 \(P_i\) 分,但并不是每种宝物都是可以随意获取的。第 \(i\) 种宝物有一个前提宝物集合 \(S_i\)。只有当 \(S_i\) 中所有宝物都至少吃过一次,才能吃第 \(i\) 种宝物(如果系统抛出了一个目前不能吃的宝物,相当于白白的损失了一次机会)。注意,\(P_i\) 可以是负数,但如果它是很多高分宝物的前提,损失短期利益而吃掉这个负分宝物将获得更大的长期利益。

假设你采取最优策略,平均情况你一共能在奖励关得到多少分值?

Input Format

第一行为两个正整数 \(k\) 和 \(n\) ,即宝物的数量和种类。以下 \(n\) 行分别描述一种宝物,其中第一个整数代表分值,随后的整数依次代表该宝物的各个前提宝物(各宝物编号为 \(1\) 到 \(n\)),以 \(0\) 结尾。

Output Format

输出一个实数,保留六位小数,即在最优策略下平均情况的得分。

Sample

Input 1

1 2
1 0
2 0

Output 1

1.500000

Input 2

6 6
12 2 3 4 5 0
15 5 0
-2 2 4 5 0
-11 2 5 0
5 0
1 2 4 5 0

Output 2

10.023470

Range

\(1 \le k \le 100, 1 \le n \le 15\),分值为 \([-106,106]\) 内的整数。

Algorithm

\(DP\),状压

Mentality

如你所见,这题和概率期望几乎没什么关系。

容易得到一个状压 \(dp\) 的思路,那就是设 \(f[i][S]\) 代表已经选了 \(i\) 轮宝物,已选的宝物种类的集合为 \(S\) ,那么 \(dp\) 式子也就很简单了,即为 \(f[i][S]+=f[i-1][S\ xor\ (1<<(j-1))](j-1\in S)\),不过要保证 \(S\) 合法。同时因为有期望的要求,每种情况的概率都为 \(\frac{1}{n}\) ,则我们转移的时候还要除以 \(n\)。

因为有前缀选择的要求,所以状态 \(S\) 很难做到保证合法。此时我们应该考虑用一种特殊的方法来 \(dp\) ,那就是逆推。

和之前倒还是一样,设 \(f[i][S]\) 为第 \(i\) 轮集合为 \(S\) 的最大分数。不过我们改为倒推的方式进行,设 \(pre[i]\) 为 \(i\) 的前缀选择要求集合, \(dp\) 方程则变为:

\[pre[j]\in S\ \ f[i][S]+=\frac{max(f[i+1][S],f[i+1][S|(1<<(j-1)])}{n}
\]

\[pre[j]\notin S\ \ f[i][S]+=\frac{f[i+1][S]}{n}
\]

最后的答案则为 \(f[1][0]\) 。

Code

#include <cstdio>
#include <iostream>
using namespace std;
int n, K, pre[16], a[16];
double f[101][1 << 15];
int main() {
cin >> K >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
int x;
cin >> x;
for (; x; cin >> x) pre[i] |= (1 << (x - 1));
} //处理前缀要求的集合
for (int j = K; j >= 1; j--) //逆推
for (int S = 0; S < (1 << n); S++) {
for (int i = 1; i <= n; i++)
if ((S & pre[i]) == pre[i]) //如果满足要求,则可转移
f[j][S] += max(f[j + 1][S], f[j + 1][S | (1 << (i - 1))] + a[i]);
else
f[j][S] += f[j + 1][S];
f[j][S] /= n; //处理期望值
}
printf("%.6lf", f[1][0]);
}

【SCOI 2008】奖励关的更多相关文章

  1. [SCOI 2008] 奖励关

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1076 [算法] f[i][S]表示当前第i次抛出宝物,目前集合为S,所能获得的最高分 ...

  2. SCOI 2008 【奖励关】

    早上的考试一道都做不出,被教做人,心态爆炸ing...... 题目描述: 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必 ...

  3. Bzoj1076 [SCOI2008]奖励关

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1935  Solved: 1053 Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一 ...

  4. 【bzoj1076】[SCOI2008]奖励关

    题目描述 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再 ...

  5. 【BZOJ1076】[SCOI2008]奖励关 状压DP+期望

    [BZOJ1076][SCOI2008]奖励关 Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须 ...

  6. 【BZOJ-1076】奖励关 概率与期望 + 状态压缩DP

    1076: [SCOI2008]奖励关 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1602  Solved: 891[Submit][Status ...

  7. 【BZOJ】1076: [SCOI2008]奖励关(状压dp+数学期望)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1076 有时候人蠢还真是蠢.一开始我看不懂期望啊..白书上其实讲得很详细的,什么全概率,全期望(这个压 ...

  8. 【BZOJ】【1076】【SCOI2008】奖励关

    状压DP+数学期望 蒟蒻不会啊……看题跑…… Orz了一下Hzwer,发现自己现在真是太水了,难道不看题解就一道题也不会捉了吗? 题目数据范围不大……100*(2^16)很容易就跑过去了…… DP的时 ...

  9. 1076: [SCOI2008]奖励关( dp )

    期望状压dp.... ------------------------------------------------------------------ #include<cstdio> ...

随机推荐

  1. 7、 jade 、 ejs、express集成模板

    jade/ejs 模板引擎 http://jade-lang.com/ http://www.nooong.com/docs/jade_chinese.htm SSR 服务器端渲染 服务器生成html ...

  2. 1、js基础内容

    js基础内容 1. 编辑器 编译环境 浏览器 编辑软件 sublime DW H5Build Atom ==[注]尽可能多的去使用编辑器去编辑代码.== Html+css ==JS 逻辑== 比作建设 ...

  3. CF3A Shortest path of the king

    The king is left alone on the chessboard. In spite of this loneliness, he doesn't lose heart, becaus ...

  4. Git查看两个版本之间修改了哪些文件

    gdiff 63e3b647d55fcc643e793e650c893be8601719b1 548cdaf01dbc2f08d1ca0b697a24afe512b75a2f --stat git l ...

  5. oracle_18c新建用户用normal登陆失败

    工具介绍:win10系统,使用的是oracle18c. 首先说一下oracle18c的特性,在oracle18c创建用户要以c##开头,比如: --创建新用户create user c##test_u ...

  6. 【UML】NO.53.EBook.5.UML.1.013-【UML 大战需求分析】- 组合结构图(Composition Structure Diagram)

    1.0.0 Summary Tittle:[UML]NO.52.EBook.1.UML.1.012-[UML 大战需求分析]- 交互概览图(Interaction Overview Diagram) ...

  7. Linux下批量杀掉筛选进程

    在做项目的时候,由于情况要求,需要把服务器上符合某一条件的进程全部kill掉,但是又不能使用killAll直接杀掉某一进程名称包含的所有运行中的进程(即我们可能只需要杀掉某一类含有特定参数命令的进程) ...

  8. android studio相关配置

    启动出现:Unable to access Android SDK add-on list 解决: Android Studio First Run 检测 Android SDK 及更新,由于众所周知 ...

  9. Kaggle比赛:从何着手?

    介绍 参加Kaggle比赛,我必须有哪些技能呢? 你有没有面对过这样的问题?最少在我大二的时候,我有过.过去我仅仅想象Kaggle比赛的困难度,我就感觉害怕.这种恐惧跟我怕水的感觉相似.怕水,让我无法 ...

  10. Treap仿set 模板

    Treap仿set 模板 蓝书232 &代码: #include <cstdio> #include <bitset> #include <iostream> ...