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

  其实题目有个地方刚开始没看懂...

  刚开始说了你必须在跑出下一个宝物之前做出选择,然后我以为和执行最优策略矛盾了...

  事实上你所得到的都是期望得分

  必须在跑出下一个宝物之前作出选择,是因为游戏的具体过程是由系统操作的我们不清楚

  而执行最优策略只要在系统执行的一些概率条件下 作出能够得到最大期望得分的操作

  我们考虑倒序DP

  枚举当前是哪一轮,以及作出选择之前n个数取与不取的状态是怎样的

  再枚举这一轮系统抛下的宝物是哪一件

  如果满足这个宝物可以取,就在取与不取之间作取舍,如果不可以取,就只能不取

  最后再思考一个问题

  题目中有一句话“现在决定不吃的宝物以后也不能再吃”,这个限制在DP过程中并没有体现

  另外要注意,这个条件限制存在仅当目前这个宝物可以吃,也就是我们有自主选择的权利

  然而仔细想一想便可知是不存在问题的

  因为当前可以吃的宝物,以后一定也可以吃,因为已经满足了前提宝物集合的条件

  然而现在吃掉,在以后还可以吃一些前提宝物集合为当前宝物的宝物

  所以当前吃掉一定比以后吃掉的策略要优秀

  所以在执行最优决策的过程中是不存在现在不吃以后吃的情况的~

 program bzoj1076;
const maxn = ;maxm = ;
var i,k,n,x,j,p:longint;
w:array[-..maxn]of longint;
a:array[-..,-..]of longint;
vis:array[-..,-..maxm]of boolean;
f:array[-..maxn,-..maxm]of extended; function ok(x,y:longint):boolean;
var i:longint;
tmp:array[-..]of longint;
begin
for i:= to n do tmp[i]:=y >> (n-i) and ;
for i:= to a[x,] do if tmp[a[x,i]]= then exit(false);
exit(true);
end; function max(a,b:extended):extended;
begin
if a>b then exit(a) else exit(b);
end; begin
readln(k,n);
fillchar(a,sizeof(a),);
for i:= to n do
begin
read(w[i]);
read(x);
while x<> do
begin
inc(a[i,]);
a[i,a[i,]]:=x;
read(x);
end;
readln;
end;
for i:= to n do
for j:= to << n- do vis[i,j]:=ok(i,j);
for i:=k downto do //i表示当前进行到第i轮
for j:= to << n- do //n件物品取与不取的状态
begin
for p:= to n do if vis[p,j] then f[i,j]:=f[i,j]+max(f[i+,j],f[i+,j or ( << (n-p))]+w[p]) else f[i,j]:=f[i,j]+f[i+,j];
f[i,j]:=f[i,j]/n;
end;
writeln(f[,]::);
end.

[BZOJ1076][SCOI2008]奖励关解题报告|状压DP的更多相关文章

  1. 2018.09.23 bzoj1076: [SCOI2008]奖励关(期望+状压dp)

    传送门 一道神奇的期望状压dp. 用f[i][j]f[i][j]f[i][j]表示目前在第i轮已选取物品状态为j,从现在到第k轮能得到的最大贡献. 如果我们从前向后推有可能会遇到不合法的情况. 所以我 ...

  2. 洛谷 P2473 [SCOI2008]奖励关 解题报告

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

  3. [BZOJ1087][SCOI2005]互不侵犯King解题报告|状压DP

    在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 好像若干月前非常Naive地去写过DFS... ...

  4. 【SCOI2008】奖励关 题解(状压DP+期望)

    题目链接 题目大意:给定$n$个宝物,每次随机抛出一个宝物,奖励分数为$p_i$.但如果选这个宝物必须选过它的前置宝物集合.共进行$K$轮问最优策略下的期望. $n\leq 15,-10^6\leq ...

  5. 洛谷P2473 [SCOI2008]奖励关(期望+状压)

    传送门 我数学期望还是太差了…… 先考虑状压模型,设$dp[i][S]$表示第$i$轮,当前宝物状态为$S$,能获得的最大期望分数 然而这个模型有一个问题,第$i$轮不一定能达到状态$S$ 那么考虑转 ...

  6. BZOJ1076 [SCOI2008]奖励关 【状压dp + 数学期望】

    1076: [SCOI2008]奖励关 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 3074  Solved: 1599 [Submit][Sta ...

  7. bzoj1076: [SCOI2008]奖励关(期望dp+状压dp)

    1076: [SCOI2008]奖励关 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2989  Solved: 1557[Submit][Statu ...

  8. [BZOJ1076][SCOI2008]奖励关 状压dp

    1076: [SCOI2008]奖励关 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3070  Solved: 1595[Submit][Statu ...

  9. BZOJ1076 [SCOI2008]奖励关 概率 状态压缩动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1076 题意概括 有n个东西,k次扔出来.每次等概率扔出其中一个. 你可以拿这个东西,但是有条件,得 ...

随机推荐

  1. iOS- iOS 和 Android 的后台推送原理各是什么?有什么区别?

    iOS 的推送iOS 在系统级别有一个推送服务程序使用 5223 端口.使用这个端口的协议源于 Jabber 后来发展为 XMPP ,被用于 Gtalk 等 IM 软件中.所以, iOS 的推送,可以 ...

  2. MindManager2018 修改过期时间 配置文件路径

    路径:C:\Users\likui\AppData\Roaming\MindManager\MindManager2018.ini 文件中记录了安装时间和最后一次启动时间. [MindManager] ...

  3. C#部分语法总结

    1. Frst和FirstOrDefault 1. Fist 如果查询的数据不存在, 则抛System.InvalidOperationException异常 2. FirstOrdefault 如果 ...

  4. ManagementClass("Win32_Share")之共享目录

    public class ShareFolder { private static readonly Dictionary<uint, string> ReturnDetails = ne ...

  5. SonarQube安装

    要求 至少1G以上内存,推荐为2G Java:Oracle JRE 7u75+,OpenJDK 7u75+ 数据库: Microsoft SQL Server 2008/2012/2014 MySQL ...

  6. [计算机网络] C++模拟telnet登陆SMTP服务发送邮件过程

    在百度文库中的<使用telnet协议收发邮件>,我们可以很清楚地看到如何通过telnet来进行发送邮件,下面是一些需要用到的命令,通过以下命令可以很容易实现邮件发送功能.为了更好地理解其中 ...

  7. RT-thread内核之线程内核对象

    在RT-Thread实时操作系统中,任务采用了线程来实现,线程是RT-Thread中最基本的调度单位,它描述了一个任务执行的上下文关系,也描述了这个任务所处的优先等级.重要的任务能拥有相对较高的优先级 ...

  8. Python正则表达式re模块

    re.compile(pattern,flags=0)将正则表达式编译成正则表达式对象.可以使用match()和search()方法进行匹配.对于常用的表达式可以先进行编译,后续可多次使用以提高效率. ...

  9. python中深copy,浅copy

    版权声明:本文为博主原创文章,未经博主允许不得转载. >>> mylist1 = [1, 2, 3, 4] >>> myl = mylist1 >>&g ...

  10. 使用thymeleaf实现div中加载html

    目标:固定顶部或者左侧导航,点击导航动态更新中间content区域的页面,也就是在放一个div在页面上,把html加载到div里,以前类似的实现都是通过Iframe或者js实现,在使用springbo ...