题解 [SCOI2008] 奖励关
为了这道题我学了期望 dp(?
为什么会有人期望 dp 入门是这道题啊歪(#`O′)
wtx 一眼秒杀了这题,我们一起来膜拜他!
其实这题很水但是我之前没学过期望 dp 我是什么 nt。
显然我们以每一轮游戏为阶段,同时要记录每个宝物的状态取或没取,宝物最多 15 个,很容易想到状压。
令 \(f_{i,S}\) 为已经到第 \(i\) 轮游戏,取了 \(S\) 到最后的取完的最大期望。
如果能选,那么对于第 \(j\) 个物品有两种可能,选或不选,因此 \(f_{i, S} = f_{i, S} + \max\{f_{i + 1, S}, f_{i + 1, S | (1 << j)} + p_j\}\)。
可能有人并不理解其实只有你 SBSX,为什么是 \(f_{i + 1, S | (1 << j)}\) 而不是 \(f_{i + 1, S - (1 << j)}\) 呢?因为这是倒推!倒推!倒推!倒推!
如果不能选显然 \(f_{i, S} = f_{i, S} + f_{i + 1, S}\),最后 \(f_{i, S} \gets f_{i, S} / n\)。
所以这题确实挺简单的。
//SIXIANG
#include <iostream>
#include <iomanip>
#define MAXN 100
#define QWQ cout << "QWQ" << endl;
using namespace std;
double f[MAXN + 10][(1 << 15) + 10], v[MAXN + 10];
int tot[MAXN + 10][MAXN + 10], c[MAXN + 10], pd[MAXN + 10];
void addbat(int &S, int k) {S -= (1 << k);}
bool get(int S, int k) {return ((S >> k) & 1);}
bool check(int S, int i) {
for(int p = 0; p < c[i]; p++)
if(!get(S, tot[i][p])) return 0;
return 1;
}
signed main() {
int k, n;
cin >> k >> n;
for(int p = 0; p < n; p++) {
cin >> v[p];
int t = 0;
while(1) {
cin >> tot[p][t];
if(!tot[p][t]) break;
pd[p] |= (1 << tot[p][t] - 1);
}
}
for(int p = k; p >= 1; p--) {
for(int S = 0; S < (1 << n); S++) {
for(int i = 0; i < n; i++) {
if((S & pd[i]) == pd[i])
f[p][S] += max(f[p + 1][S], f[p + 1][S | (1 << i)] + v[i]);
else
f[p][S] += f[p + 1][S];
}
f[p][S] /= double(n);
}
}
cout << fixed << setprecision(6) << f[1][0] << endl;
}
题解 [SCOI2008] 奖励关的更多相关文章
- 【BZOJ1076】[SCOI2008]奖励关 状压DP+期望
[BZOJ1076][SCOI2008]奖励关 Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须 ...
- 1076: [SCOI2008]奖励关
1076: [SCOI2008]奖励关 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2078 Solved: 1118[Submit][Statu ...
- 1076: [SCOI2008]奖励关( dp )
期望状压dp.... ------------------------------------------------------------------ #include<cstdio> ...
- BZOJ_1076_[SCOI2008]奖励关_状压DP
BZOJ_1076_[SCOI2008]奖励关_状压DP 题意: 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛 ...
- LG P2473 [SCOI2008]奖励关
题目链接:P2473 [SCOI2008]奖励关 题意:有n个宝物 每次等概率抛出其中之一一共抛出k次每个宝物有一个价值 和一个前提集合只有集齐了集合中的所有宝物 才可以领取这个宝物 范围:1 < ...
- P2473 [SCOI2008]奖励关(期望)
P2473 [SCOI2008]奖励关 $n<=15$,显然的状压 设$f[i][w]$表示前$i$轮,状态$w$的最大期望 蓝后我们发现一个问题:$f[i][w]$可能是非法的 于是我们从$f ...
- 洛谷 P2473 [SCOI2008]奖励关 解题报告
P2473 [SCOI2008]奖励关 题目描述 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出\(k\)次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝 ...
- 【洛谷】2473:[SCOI2008]奖励关【期望DP(倒推)】
P2473 [SCOI2008]奖励关 题目背景 08四川NOI省选 题目描述 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不 ...
- 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 ...
随机推荐
- Day29 派生, 封装 , 多态, 反射
Day29 派生, 封装 , 多态, 反射 内容概要 派生方法的实践 面向对象之封装 面向对象之多态 面向对象之反射 反射的实践案例 内容详细 1.派生方法的实践 #需求展示 import json ...
- vulnhub靶场之HACKSUDO: THOR
准备: 攻击机:虚拟机kali.本机win10. 靶机:hacksudo: Thor,下载地址:https://download.vulnhub.com/hacksudo/hacksudo---Tho ...
- Day33:String类及其常用方法详解
String类 1.1 String类概述 Java中字符串属于对象,String类用于创建和操作字符串. 最简单的字符串创建:直接通过String创建 String str="工地佬&qu ...
- SQL一文入门助记
什么是SQL SQL(Structured Query Language)是用于操作数据库的语言.一个博客有许多网站,一个游戏要储存许多游戏的账号密码,这些都离不开数据库操作. 关系型数据库与NoSQ ...
- Redis的数据持久化
介绍 Redis 的数据持久化方案 Redis 的数据持久化主要有两大机制,AOF 日志和 RDB 快照. AOF 持久化是通过保存 Redis 服务器所执行的写命令来记录数据库状态. RDB 持久化 ...
- Hadoop详解(02)Hadoop集群运行环境搭建
Hadoop详解(02)Hadoop集群运行环境搭建 虚拟机环境准备 虚拟机节点数:3台 操作系统版本:CentOS-7.6-x86-1810 虚拟机 内存4G,硬盘99G IP地址分配 192.16 ...
- Java学习记录:2022年1月13日(其二)
Java学习记录:2022年1月13日(其二) 摘要:本篇笔记主要记录了在设计类时的一些注意事项,类加载时类中各个部分的加载顺序以及继承和多态的知识. 目录 Java学习记录:2022年1月13日 ...
- API 网关的功能用途及实现方式
1. API 网关诞生背景 前言 API 经济生态链已经在全球范围覆盖, 绝大多数企业都已经走在数字化转型的道路上,API 成为企业连接业务的核心载体, 并产生巨大的盈利空间.快速增长的 API 规模 ...
- 解决安装node-sass报错的方法
1.下载源码放到本地搞~~ 适合内网开发的苦孩子们~~~ 先进入https://github.com/sass/node-sass/releases下载自己需要的包 可以点击tags然后找到自己需要的 ...
- Java 进阶P-8.5+P-8.6
抛出异常 异常的抛出与声明 如果你的函数可能抛出异常,就必须在函数头部加以声明 你可以声明并不会真的抛出得异常 什么能扔? 任何继承了Throw able类的对象 Exception类继承了Throw ...