BZOJ 1076 [SCOI2008]奖励关

Description

  你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关。在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃)。 宝物一共有$n$种,系统每次抛出这$n$种宝物的概率都相同且相互独立。也就是说,即使前$k-1$次系统都抛出宝物$1$(这种情况是有可能出现的,尽管概率非常小),第k次抛出各个宝物的概率依然均为$\frac 1 n$。 获取第i种宝物将得到Pi分,但并不是每种宝物都是可以随意获取的。第i种宝物有一个前提宝物集合$S_i$。只有当$S_i$中所有宝物都至少吃过一次,才能吃第i种宝物(如果系统抛出了一个目前不能吃的宝物,相当于白白的损失了一次机会)。注意,Pi可以是负数,但如果它是很多高分宝物的前提,损失短期利益而吃掉这个负分宝物将获得更大的长期利益。 假设你采取最优策略,平均情况你一共能在奖励关得到多少分值?

Input

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

Output

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

Sample Input

1 2
1 0
2 0

Sample Output

1.500000

HINT

【数据规模】

$1<=k<=100$,$1<=n<=15$,分值为$[-10^6,10^6]$内的整数。


注意到n的值很小,考虑概率DP配合状态压缩储存状态。

设$f[i][j]$为从第$i$次开始接宝物,并且当前状态为$j$的期望值。

若当前宝物可以被接住,则$f[i][j]=f[i][j]+max(f[i+1][j],f[i+1][j|p[k]]+v[k])$

否则,$f[i][j]+=f[i+1][j]$

实现不难,上代码:

 #include<iostream>
#include<cstdio>
#define foru(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
double f[][];
int n,k,t,v[],d[],p[];
int main(){
scanf("%d%d",&n,&k);
foru(i,,)p[i]=<<(i-);
foru(i,,k){
scanf("%d",&v[i]);
while(scanf("%d",&t),t)
d[i]+=p[t];
}
for(int i=n;i;i--)
foru(j,,p[k+]-){
foru(l,,k)
((d[l]&j)==d[l])?f[i][j]+=max(f[i+][j],f[i+][j|p[l]]+v[l]):f[i][j]+=f[i+][j];
f[i][j]/=k;
}
printf("%.6lf\n",f[][]);
}

bzoj1076 奖励关(概率dp)(状态压缩)的更多相关文章

  1. 【bzoj1076】[SCOI2008]奖励关 期望dp+状态压缩dp

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

  2. hdu4336 Card Collector(概率DP,状态压缩)

    In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, fo ...

  3. bzoj1076 奖励关 期望dp

    题目传送门 题目大意:总共有k次弹出宝物的机会,宝物共有n种,弹出不同的宝物的概率相同的,是每个宝物都有价值,和选择这个宝物的限制(必须具有特定的宝物),问最后的最优期望是多少. 思路:“正向推概率, ...

  4. [BZOJ1076][SCOI2008]奖励关(概率DP)

    Code #include <cstdio> #include <algorithm> #include <cstring> #define N 110 #defi ...

  5. BZOJ.1076.[SCOI2008]奖励关(概率DP 倒推)

    题目链接 BZOJ 洛谷 真的题意不明啊.. \(Description\) 你有k次选择的机会,每次将从n种物品中随机一件给你,你可以选择选或不选.选择它会获得这种物品的价值:选择一件物品前需要先选 ...

  6. hdu4336Card Collector 概率dp+状态压缩

    //给n个卡片每次出现的概率,求全部卡片都出现的须要抽的次数的期望 //dp[i]表示在状态的情况下到全部的卡片都出现的期望 //dp[i] = 1 + p1*dp[i] + ${p2[j]*dp[i ...

  7. BZOJ 1076: [SCOI2008]奖励关(概率+dp)

    首先嘛,看了这么久概率论真的不错啊。看到就知道怎么写(其实也挺容易的= =) 直接数位dp就行了 CODE: #include<cstdio> #include<cstring> ...

  8. 【BZOJ 3925】[Zjoi2015]地震后的幻想乡 期望概率dp+状态压缩+图论知识+组合数学

    神™题........ 这道题的提示......(用本苣蒻并不会的积分积出来的)并没有 没有什么卵用 ,所以你发现没有那个东西并不会 不影响你做题 ,然后你就可以推断出来你要求的是我们最晚挑到第几大的 ...

  9. HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

    题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...

随机推荐

  1. Java算法练习——两数之和

    题目链接 题目描述 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利 ...

  2. java 的二分算法

    二分算法 就是在 一组 有序 数组中 通过中间值(数组中间的那个数字)的方法 找到 某个数的下标,如果大于中间值 ,则在中间值与最大值之间 的中间值再比较. public class two { // ...

  3. CTF-域渗透--HTTP服务--命令注入2

    开门见山 1. 启动metasploit 2. 设置参数参数选项 3. 查看最后设置后的结果 4. 启动监听 5. 使用msfvemon制作webshell 6. 开启apache服务 7. 使用ba ...

  4. (转)Java中的容器详细总结

    Java中的容器详细总结(编辑中) 原文链接:http://anxpp.com/index.php/archives/656/ 注:本文基于 Jdk1.8 编写 通常程序总是根据运行时才知道的某些条件 ...

  5. 18 11 13 装了ssd 继续 网络通信 tcp 客户端的创建

    import socket def main(): # 1. 买个手机(创建套接字 socket) 联通公司建立了一个信号塔 tcp_server_socket = socket.socket(soc ...

  6. python版本,执行

    01. 第一个 HelloPython 程序 1.1 Python 源程序的基本概念 Python 源程序就是一个特殊格式的文本文件,可以使用任意文本编辑软件做 Python 的开发 Python 程 ...

  7. Django框架(八):视图(一) URLconf、视图

    1. 视图 视图的功能就是接收请求,进行处理,与M和T进行交互,返回应答. 返回html内容HttpResponse,也可能重定向redirect,还可以返回json数据. 1.1 URLconf 1 ...

  8. 吴裕雄--天生自然 PHP开发学习:函数

    <?php function writeName() { echo "Kai Jim Refsnes"; } echo "My name is "; wr ...

  9. UML-领域模型-准则

    1.是否使用工具维护模型? 在白板上画完草图后,整理到UML工具里去 2.模型中是否要包含“票据”? 不包含,因为,票据用于退货,而本次迭代不涉及退货所以不需要体现. 总结:概念一定在本次迭代需求内的 ...

  10. UINavigationbar跳转黑色

    bug效果:导航栏过渡出现黑色