bzoj千题计划206:bzoj1076: [SCOI2008]奖励关
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]奖励关的更多相关文章
- BZOJ1076 [SCOI2008]奖励关 【状压dp + 数学期望】
1076: [SCOI2008]奖励关 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3074 Solved: 1599 [Submit][Sta ...
- [BZOJ1076][SCOI2008]奖励关 状压dp
1076: [SCOI2008]奖励关 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3070 Solved: 1595[Submit][Statu ...
- bzoj1076: [SCOI2008]奖励关(期望dp+状压dp)
1076: [SCOI2008]奖励关 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2989 Solved: 1557[Submit][Statu ...
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- BZOJ1076:[SCOI2008]奖励关(状压DP,期望)
Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的 ...
- [BZOJ1076][SCOI2008]奖励关解题报告|状压DP
你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃). 宝 ...
- Bzoj1076 [SCOI2008]奖励关
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1935 Solved: 1053 Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一 ...
- BZOJ1076: [SCOI2008]奖励关【状压DP+期望DP】
Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的 ...
- bzoj千题计划179:bzoj1237: [SCOI2008]配对
http://www.lydsy.com/JudgeOnline/problem.php?id=1237 如果没有相同的数不能配对的限制 那就是排好序后 Σ abs(ai-bi) 相同的数不能配对 交 ...
随机推荐
- HTML5 标签实例
html 5 学习1.<p></p> #段落元素定义2.<h1></h1> #标题 h1代表大号的字体.依此变小3.<br /> #实例 代 ...
- pandas 初识(一)
基本内容 Series: Series 是有一组数据(numpy的数据类型 numpy.ndarray)以及一组数据标签(即索引)组成,可以看成一个一个定长的有序字典(索引值到数据值的一个映射) ob ...
- idou老师教你学Istio 17 : 通过HTTPS进行双向TLS传输
众所周知,HTTPS是用来解决 HTTP 明文协议的缺陷,在 HTTP 的基础上加入 SSL/TLS 协议,依靠 SSL 证书来验证服务器的身份,为客户端和服务器端之间建立“SSL”通道,确保数据运输 ...
- Java serialVersionUID作用和生成
序列化和反序列化Java是面向对象的语言,与其他语言进行交互(比如与前端js进行http通信),需要把对象转化成一种通用的格式比如json(前端显然不认识Java对象),从对象到json字符串的转换, ...
- 三种迭代Java ArrayList方法及比较
闲来无事,研究一下Java Collection,首先是ArrayList. 通过三种方式遍历了长度为100000的ArrayList. import java.util.*; public clas ...
- 20181204-4 互评Final版本
此次作业要求参见https://edu.cnblogs.com/campus/nenu/2018fall/homework/2478 互评 一.互评Final版本——杨老师粉丝群<PinBall ...
- NBPL团队总结
我们团队钱多多记账软件项目从2017年12月号开始,历时两个周.这两个周,我们从头学起,学到了很多新的知识,对一些概念有了认知,关于团队协作,关于团队建设,关于Android开发.回顾前两周,我们一致 ...
- beta4
吴晓晖(组长) 过去两天完成了哪些任务 昨天FloatingActionButton和权限获取调整 今天复习,没写东西,晚点有空了写 展示GitHub当日代码/文档签入记录 接下来的计划 推荐算法 还 ...
- python scipy stats学习笔记
from scipy.stats import chi2 # 卡方分布from scipy.stats import norm # 正态分布from scipy.stats import t # t分 ...
- HTTP协议(1)
HTTP 协议笔记 1. HTTP 传输机制 HTTP 是一个应用层协议,位于 TCP 的层次之上,并且是基于 TCP 协议进行通信的,也就是说 HTTP 在每一次通信之前都要先建立 TCP 连接来保 ...