http://www.lydsy.com/JudgeOnline/problem.php?id=1076

很容易想到方程

dp[i][j]表示抛出了i个宝物,已选宝物状态为j的期望最大得分

初始化dp[0][0]=0,其余都为负无穷

设宝物i的前提宝物集合为pre[i]

枚举第i次抛,当前已选宝物状态j,这一次抛出了第l个宝物

若 j&pre[l]==pre[l]  那么这个宝物就可以选,也可以不选

选,转移到dp[i+1][j|1<<l-1]

不选,转移到dp[i+1][j]

否则,这个宝物一定不能选,转移到dp[i+1][j]

那么问题来了,最后宝物状态集合是什么,最后输出什么?

Σ dp[n][s]/s ?

错误

因为 最后每种宝物状态出现的概率不一样

那就再递推个每种状态出现的概率?

尝试写了一发,

但状态出现的概率到后面会非常小非常小,小到让我存不了。。。

所以本思路GG

对了两个点,+递推出现概率的代码:

#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; int val[],pre[]; int bit[]; double dp[][<<];
double f[][<<];
bool vis[][<<]; const double eps=1e-; void read(int &x)
{
x=; int f=; char c=getchar();
while(!isdigit(c)) { if(c=='-') f=-; c=getchar(); }
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
x*=f;
} bool dcmp(double a,double b)
{
return fabs(a-b)<eps;
} int main()
{
int k,n;
read(k); read(n);
bit[]=;
for(int i=;i<=n;++i) bit[i]=bit[i-]<<;
int x;
for(int i=;i<=n;++i)
{
read(val[i]);
while()
{
read(x);
if(!x) break;
pre[i]+=bit[x-];
}
}
int s=bit[n];
vis[][]=true;
f[][]=;
for(int i=;i<k;++i)
for(int j=;j<s;++j)
if(vis[i][j])
{
for(int l=;l<=n;++l)
if((j&pre[l])==pre[l])
{
if((dp[i][j]+val[l])*f[i][j]/n>dp[i+][j|bit[l-]]*f[i+][j|bit[l-]])
{
dp[i+][j|bit[l-]]=dp[i][j]+val[l];
f[i+][j|bit[l-]]=f[i][j]/n;
vis[i+][j|bit[l-]]=true;
}
else if(dcmp((dp[i][j]+val[l])*f[i][j]/n,dp[i+][j|bit[l-]]*f[i+][j|bit[l-]]))
{
f[i+][j|bit[l-]]+=f[i][j]/n;
vis[i+][j|bit[l-]]=true;
}
}
}
double ans=;
for(int i=;i<s;++i) ans+=dp[k][i]*f[k][i];
printf("%.6lf",ans);
}

正解:倒推

dp[i][j] 表示抛了i个宝物,所选状态为j的最大期望得分

枚举这次抛出第l种宝物

能选,j&pre[l]==pre[l]

那么从选与不选里取最优解,dp[i][j]+=max(dp[i+1][j],dp[i+1][j|1<<l-1])

不能选 dp[i][j]+=dp[i+1][j]

对于dp[i][j] 来说,枚举n种可能抛出哪种宝物,概率是同样的

所以最后dp[i][j]/n 即是状态的期望得分

最后输出dp[n][0]

#include<cstdio>
#include<iostream> using namespace std; int val[],pre[]; int bit[]; double dp[][<<]; void read(int &x)
{
x=; int f=; char c=getchar();
while(!isdigit(c)) { if(c=='-') f=-; c=getchar(); }
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
x*=f;
} int main()
{
int k,n;
read(k); read(n);
bit[]=;
for(int i=;i<=n;++i) bit[i]=bit[i-]<<;
int x;
for(int i=;i<=n;++i)
{
read(val[i]);
while()
{
read(x);
if(!x) break;
pre[i]+=bit[x-];
}
}
int S=bit[n];
for(int i=k;i;--i)
for(int j=;j<S;++j)
{
for(int l=;l<=n;++l)
if((j&pre[l])==pre[l]) dp[i][j]+=max(dp[i+][j],dp[i+][j|bit[l-]]+val[l]);
else dp[i][j]+=dp[i+][j];
dp[i][j]/=n;
}
printf("%.6lf",dp[][]);
}

bzoj千题计划206:bzoj1076: [SCOI2008]奖励关的更多相关文章

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

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

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

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

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

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

  4. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  5. BZOJ1076:[SCOI2008]奖励关(状压DP,期望)

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

  6. [BZOJ1076][SCOI2008]奖励关解题报告|状压DP

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

  7. Bzoj1076 [SCOI2008]奖励关

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

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

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

  9. bzoj千题计划179:bzoj1237: [SCOI2008]配对

    http://www.lydsy.com/JudgeOnline/problem.php?id=1237 如果没有相同的数不能配对的限制 那就是排好序后 Σ abs(ai-bi) 相同的数不能配对 交 ...

随机推荐

  1. 【原创】梵高油画用深度卷积神经网络迭代10万次是什么效果? A neural style of convolutional neural networks

    作为一个脱离了低级趣味的码农,春节假期闲来无事,决定做一些有意思的事情打发时间,碰巧看到这篇论文: A neural style of convolutional neural networks,译作 ...

  2. Monkey基本使用

    什么是 Monkey Monkey 是一个 Android 自动化测试小工具.主要用于Android 的压力测试, 主要目的就是为了测试app 是否会Crash. Monkey 特点 顾名思义,Mon ...

  3. redis在php中常用的语法(转)

    String 类型操作 string是redis最基本的类型,而且string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象 $redis-> ...

  4. Istio如何使用相同的端口访问网格外服务

    1.1.背景 写这篇文章的目的是为了说明以下问题:如何使用TCP协议相同的端口访问网格外多个服务? 这是最近直播的时候有一个同学提出的,当时我没有完全明白,“访问多集群” 的意思.后来仔细思考了一下, ...

  5. django反向解析URL和URL命名空间

    django反向解析URL和URL命名空间 首先明确几个概念: 1.在html页面上的内容特别是向用户展示的url地址,比如常见的超链接,图片链接等,最好能动态生成,而不要固定. 2.一个django ...

  6. 原生和jquery 的 ajax

    form数据的序列化: $('#submit').click(function(){ $('#form').serialize(); //会根据input里面的name,把数据序列化成字符串:eg:n ...

  7. 一份超全超详细的 ADB 用法大全

    http://blog.csdn.net/u010375364/article/details/52344120

  8. 【SE】Week2 : 个人博客作业

    1. 是否需要有代码规范 对于是否需要有代码规范,请考虑下列论点并反驳/支持: Statement1 :  这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. 这样的 ...

  9. 团队作业4——WBS练习

    一.作业要求 对团队项目进行任务分解 —要求所有人共同参与 队长列出需求 成员进行估计 队长领导大家达成共识 形成团队报告,发至团队博客 注意:分解的粒度最小不应超过6小时(即一个人在6小时以内能够完 ...

  10. Linux命令行上传本地文件到服务器 、 下载服务器文件到本地

    sh使用命令: scp 将本地文件上传至服务器 第一个是本地文件的路径/文件名, 例如 ./index.tar.gz  . index.html . bg.png 等 第二个是要上传到的服务器的位置  ...