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) 相同的数不能配对 交 ...
随机推荐
- effective c++ 笔记 (18-22)
//---------------------------15/04/06---------------------------- //#18 让接口容易被正确使用,不易被误用 { // 1:为了防 ...
- POJ1094——拓扑排序和它的唯一性
比较模板的topological-sort题,关键在于每个元素都严格存在唯一的大小关系,而一般的拓扑排序只给出一个可能解,这就需要每趟排序的过程中监视它是不是总坚持一条唯一的路径. 算法导论里面的拓扑 ...
- python基础篇----基本数据类型
bit #bit_length 当前数字的二进制,只用用n位来表示a = 123b = a.bit_length()print(b)#==>7
- PHP 设计模式六大原则
http://www.cnblogs.com/yujon/p/5536118.html 设计模式六大原则(1):单一职责原则 不要存在多于一个导致类变更的原因.通俗的说,即一个类只负责一项职责 设计模 ...
- springmvc 事务回滚说明
Spring中的@Transactional(rollbackFor = Exception.class)属性详解 序言 今天我在写代码的时候,看到了.一个注解@Transactional(rollb ...
- Linux内核分析——构造一个简单的Linux系统MenuOS
马悦+原创作品转载请注明出处+<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内核源代码简 ...
- mysql 访问不是本地数据库,给用户刷新了权限没有作用
1.grant all privileges on *.* to 'yangxin'@'%' identified by 'yangxin123456' with grant option; flus ...
- vs2013安装过程及使用心得
进入http://www.itellyou.cn/ 方法/步骤 1 1:点击中文简体 2:钩出前面的空格 3:点击详细信息 4:复制到网页进行搜索迅雷下载 等待下载完成之后,双击文件 我们双击文件 ...
- week4
History:Commercialization and Growth course Explosive Growth of the Internet and Web The Year of the ...
- Beta冲刺——day3
Beta冲刺--day3 作业链接 Beta冲刺随笔集 github地址 团队成员 031602636 许舒玲(队长) 031602237 吴杰婷 031602220 雷博浩 031602134 王龙 ...