洛谷 P2473 [SCOI2008]奖励关 解题报告
P2473 [SCOI2008]奖励关
题目描述
你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关。在这个奖励关里,系统将依次随机抛出\(k\)次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃)。
宝物一共有\(n\)种,系统每次抛出这\(n\)种宝物的概率都相同且相互独立。也就是说,即使前\(k-1\)次系统都抛出宝物1(这种情况是有可能出现的,尽管概率非常小),第\(k\)次抛出各个宝物的概率依然均为\(1/n\)。
获取第\(i\)种宝物将得到\(P_i\)分,但并不是每种宝物都是可以随意获取的。第i种宝物有一个前提宝物集合\(S_i\)。只有当\(S_i\)中所有宝物都至少吃过一次,才能吃第\(i\)种宝物(如果系统抛出了一个目前不能吃的宝物,相当于白白的损失了一次机会)。注意,\(P_i\)可以是负数,但如果它是很多高分宝物的前提,损失短期利益而吃掉这个负分宝物将获得更大的长期利益。
假设你采取最优策略,平均情况你一共能在奖励关得到多少分值?
输入输出格式
输入格式:
第一行为两个正整数\(k\)和\(n\),即宝物的数量和种类。以下\(n\)行分别描述一种
宝物,其中第一个整数代表分值,随后的整数依次代表该宝物的各个前提宝物(各宝物编号为1到\(n\)),以0结尾。
输出格式:
输出一个实数,保留六位小数,即在最优策略下平均情况的得分。
说明
\(1<=k<=100, 1<=n<=15\),分值为\([-10^6,10^6]\)内的整数。
想做这个题得先弄懂条件概率
简单一点的解释是,B在A发生的条件下发生的概率。
举个栗子,掷色子第一次投6概率为1/6,为A事件,第二次投6概率仍为1/6,为B事件。如果把两次投掷产生的一个结果算成一个最终状态,那么连续的状态AB发生的概率为1/36,也即是B在A发生的条件下发生的概率。
条件概率一定得把连续的事件划为一个状态来求解。
对于具体题目来看,在第\(i\)次出现宝物的时候,我们产生的状态空间的大小即为\(1/n^i\)。对于其中每一个状态空间的延长我们都可以做出选和不选的决策(当然,有时候是强制不能选的),以保证最优策略。
当然,即使没有决策,我们也不能找到所有状态空间进行统计,我们发现,第\(i\)个阶段产生的某一个状态空间对第\(i+1\)个阶段的每一个可能发生的宝物都能产生一个递推,这可能出现的\(n\)个宝物将状态空间扩大了\(n\)倍。
于是我们实际上在统计的时候,对于第\(i\)个阶段宝物产生的状态空间,它在后面重复出现了\(n^{k-i}\)次,所以这一维所有的答案产生的贡献最后需要除上\(n^i\),我们通过倒推来消除可能爆精度的问题(在后面具体提到)
如果进行决策,我们利用背包的思想,将状态空间用一个新的状态表示处理,这也是转移方程中状态压缩的一维\(j\),\(j\)表示当前状态空间每个宝物是否出现。注意新的状态空间可能代表多个以往的状态空间。
按照顺着的思想从前向后递推,我们用新状态空间对当前阶段每一个可能出现的概率进行递推,等价于原状态空间对每一个概率进行递推。这时候会产生两个问题,一是我们对每一个状态空间都得朴素的除上\(n^i\),会产生新的复杂度。二是我们需要额外的判断,保证统计答案时的合法性,比较麻烦。
所以我们进行倒着做,可以对每一次产生的新状态都除以\(n\),而不必对每一个状态特殊判断。最后统计答案时也只有唯一的一个合法。
方程:\(dp[i][j]\)代表第\(i\)阶段\(j\)状态已经发生转移的最大分数。
转移:\(dp[i][j]+=\sum_{l=1}^n max(dp[i+1][j|(1<<l-1)],dp[i+1][j])\),\(max\)左边要判转移合法
目标:\(dp[1][0]\)
可能说得不严谨,大概只是个人的一点浅显的感性理解,今天也是第一次做条件概率的题,如有不足,还请提出。
Code:
#include <cstdio>
const int N=102;
double dp[N][1<<15],score[18];
double max(double x,double y){return x>y?x:y;}
int n,k,pre[18];
void init()
{
scanf("%d%d",&k,&n);
int pree;
for(int i=1;i<=n;i++)
{
scanf("%lf%d",score+i,&pree);
while(pree)
{
pre[i]|=1<<pree-1;
scanf("%d",&pree);
}
}
}
void work()
{
for(int i=k;i;i--)
for(int j=0;j<=1<<n;j++)
{
for(int l=1;l<=n;l++)
{
if((pre[l]&j)==pre[l])
dp[i][j]+=max(dp[i+1][j|(1<<l-1)]+score[l],dp[i+1][j]);
else
dp[i][j]+=dp[i+1][j];
}
dp[i][j]/=double(n);
}
printf("%.6lf",dp[1][0]);
}
int main()
{
init();
work();
return 0;
}
2018.7.3
洛谷 P2473 [SCOI2008]奖励关 解题报告的更多相关文章
- 洛谷 P2473 [SCOI2008]奖励关(状压dp+期望)
题面 luogu 题解 \(n \leq 15\) 状压 \(f[i][S]\)表示第\(i\)轮,吃过的集合为\(S\) 正着转移好像有点复杂 考虑逆推转移(正着转移应该也行) \(f[i][S]\ ...
- 洛谷P2473 [SCOI2008]奖励关(期望+状压)
传送门 我数学期望还是太差了…… 先考虑状压模型,设$dp[i][S]$表示第$i$轮,当前宝物状态为$S$,能获得的最大期望分数 然而这个模型有一个问题,第$i$轮不一定能达到状态$S$ 那么考虑转 ...
- 洛谷 P2473 [SCOI2008]奖励关 ( 期望DP )
题目链接 题意 : 中文题.点链接 分析 : 第一道有关概率期望的DP 有个大部分情况下通用的结论 概率正推.期望反推 原因不明.其实是没有查到较好的解释 这题由于有一些取物品的先决条件在这里 而且观 ...
- [BZOJ1076][SCOI2008]奖励关解题报告|状压DP
你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃). 宝 ...
- 洛谷2473(SCOI2008)奖励关
题目:https://www.luogu.org/problemnew/show/P2473 因为可不可选此物与之前选过什么物品有关,所以状态可以记录成前面已经选过什么物品. 因为选不选此物与它带来的 ...
- LG P2473 [SCOI2008]奖励关
题目链接:P2473 [SCOI2008]奖励关 题意:有n个宝物 每次等概率抛出其中之一一共抛出k次每个宝物有一个价值 和一个前提集合只有集齐了集合中的所有宝物 才可以领取这个宝物 范围:1 < ...
- P2473 [SCOI2008]奖励关(期望)
P2473 [SCOI2008]奖励关 $n<=15$,显然的状压 设$f[i][w]$表示前$i$轮,状态$w$的最大期望 蓝后我们发现一个问题:$f[i][w]$可能是非法的 于是我们从$f ...
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
随机推荐
- canvas高效绘制10万图形,你必须知道的高效绘制技巧
最近的一个客户项目中,简化的需求是绘制按照行列绘制很多个圆圈.需求看起来不难,上手就可以做,写两个for循环. 原始绘制方法 首先定义了很多Circle对象,在遍历循环中调用该对象的draw方法.代码 ...
- Python中的常规习题
循环总结 while 语句 for 语句 - 字符串 - range() 函数 break 语句 continue 语句 学习笔记传送门 列表学习 # 练习: # 输入一个整数n, 判断这个整数是否是 ...
- python处理数据pandas视频资料
python强大数据处理工具pandas视频资料:https://pan.baidu.com/s/17VRd1cgFaKi20drfCgZ8Gg
- React Native (0.57)开发环境搭建(注意:Node不要随便更新到最新版,更新完后莫名其妙的问题一大堆)
搭建开发环境 一.安装依赖 必须安装的依赖有:Node.Watchman 和 React Native 命令行工具以及 Xcode. 1.首先安装 Homebrew 2.安装 Node, Watchm ...
- ajax 异步刷新
第一种方法,ajax实现:当然,ajax使用起来确实很简单就可以实现,但是里面的很多知识还是比较有点深的.我之前做页面时间自动刷新的功能就是用的ajax.完整代码是:1.getTime.php: 复制 ...
- Laravel路由除了根目录全报404错误
Route::get('hello',function(){ return 'Hello World!'; }); 在laravel/app/Http/routes.php下添加上面的语句,然后再浏览 ...
- jQuery源码分析之整体框架
之前只是知道jQuery怎么使用,但是我觉得有必要认真的阅读一下这个库,在分析jQuery源码之前,很有必要对整个jQuery有个整体的框架概念,才能方便后面对jQuery源码的分析和学习,以下是我总 ...
- 实验1:java开发环境的熟悉
一.实验内容 1. 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试Java程序 3.实现四则运算并进行测试. 二.实验知识点 1. JVM.JRE.JDK的安装 ...
- cnblogs用户体验评价
1. 是否提供良好的体验给用户(同时提供价值)? 博客园就相当于现在生活中处处可见的微博,所有人都在上面发表自己的一些看法,当然我们比较关注的是计算机编程方面的一些博客,大多数编程人员愿意分享自己的代 ...
- magic mouse 2 使用,移动速度问题,安装问题
一.安装问题 首先确保你的OSX里面没有安装USB Overdrive.prefPane这个软件,就是“瑞士军刀”.这个软件会让你的magic mouse 2 连接上Mac后,Mac无限死机重启,有时 ...