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]);elsedp[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

转载于:https://www.cnblogs.com/butterflydew/p/9260472.html

洛谷 P2473 [SCOI2008]奖励关 解题报告相关推荐

  1. 【洛谷】P4147 玉蟾宫 解题报告

    [洛谷]P4147 玉蟾宫 解题报告 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N* ...

  2. P2473 [SCOI2008]奖励关

    思路 n<=15,所以状压 因为求期望,所以采用逆推的思路,设\(f[i][S]\)表示1~i的宝物获得情况是S,i+1~k的期望 状态转移是当k可以取时,\(f[i][S]+=max(f[i+ ...

  3. 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告

    P3539 [POI2012]ROZ-Fibonacci Representation 题意:给一个数,问最少可以用几个斐波那契数加加减减凑出来 多组数据10 数据范围1e17 第一次瞬间yy出做法, ...

  4. 「洛谷P1343」地震逃生 解题报告

    P1343 地震逃生 题目描述 汶川地震发生时,四川XX中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带, ...

  5. 洛谷 P4284 [SHOI2014]概率充电器 解题报告

    P4284 [SHOI2014]概率充电器 题目描述 著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  6. 洛谷 [SDOI2015]约数个数和 解题报告

    [SDOI2015]约数个数和 题目描述 设\(d(x)\)为\(x\)的约数个数,给定\(N,M\),求$ \sum\limits^N_{i=1}\sum\limits^M_{j=1}d(ij)$ ...

  7. 洛谷 CF1043F Make It One 解题报告

    CF1043F Make It One 题意 从一堆数中选择最少的数,使它们的\(\gcd=1\) 输入输出格式 输入格式 第一行:一个正整数\(n\). 第二行:\(n\)个正整数,给出了这个数列. ...

  8. 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告

    P3521 [POI2011]ROT-Tree Rotations 题意:递归给出给一棵\(n(1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 大体 ...

  9. 洛谷 P2324 [SCOI2005]骑士精神 解题报告

    P2324 [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,* ...

  10. 洛谷 P2389 电脑班的裁员 解题报告

    题意: 给定一段长为N的序列,选取其中的至多M段使这些子段和最大. 当N=1000时,我们可以采用动态规划解法 令\(dp[i][j][k]\)代表当前选至位置\(i\)处于第\(j\)段当前是否选取 ...

最新文章

  1. php常用的搜索引擎,常用搜索引擎高级命令有哪些
  2. 4位快速加法器设计_芯片的诞生,奇妙之旅,从RTL代码到真实芯片是怎么设计制造的...
  3. http请求在asp.net中的应用
  4. 工作多年,怀才不遇你该怎么办?
  5. python3.6.8安装失败_centos7编译安装Python 3.6.8 后用pip3出现SSL未配置问题(import ssl失败)解决方法...
  6. SpringBoot—Entity父子类表@Inheritance和@MappedSuperclass
  7. 埃斯顿服务器上电无显示,埃斯顿伺服常见现象报警及排除
  8. Java8 改进的匿名内部类:
  9. 7. 代码中特殊的注释技术——TODO、FIXME和XXX的用处
  10. 网页版在线客服实现代码
  11. 机器学习源代码_机器学习中程序源代码的静态分析
  12. html5 边框效果图,图片边框border-image的用法
  13. 月之数 HDU2502
  14. c语言安卓录屏,金舟录屏大师app下载
  15. erewrwerwer
  16. c 系统语言改为中文,主编设置win7系统英文版改成中文语言的操作技巧
  17. 全球及中国轮胎行业发展方向与销售前景状况分析报告2022年
  18. 彩灯循环控制系统 电路与电子技术 课程设计
  19. 程序员应该访问的最佳网站
  20. 什么是数字化?为什么需要数字化?

热门文章

  1. Java7/8集合框架——基本知识点
  2. [AlwaysOn Availability Groups]排查:AG配置
  3. HTML5尝鲜(1):使用aduio标签打造音乐播放器
  4. codeforces 665A Buses Between Cities
  5. Windows2008R2自动更新造成的意外重启
  6. uva 563(最大流)
  7. 苹果HTC专利战正酣: 逃离Android?
  8. linux web目录写入权限命令,Linux下Web目录和文件安全权限设置
  9. git单独删除某个文件的所有历史记录
  10. python数字合并提高_python-给定相关数字列表,合并相关列表以创...