初见安~这里是传送门:洛谷P2473

题目描述

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

宝物一共有n种,系统每次抛出这n种宝物的概率都相同且相互独立。也就是说,即使前k-1 次系统都抛出宝物1(这种情况是有可能出现的,尽管概率非常小),第k次抛出各个宝物的概率依然均为1/n。

获取第 i 种宝物将得到Pi分,但并不是每种宝物都是可以随意获取的。第i种宝物有一个前提宝物集合Si。只有当Si中所有宝物都至少吃过一次,才能吃第i 种宝物(如果系统抛出了一个目前不能吃的宝物,相当于白白的损失了一次机会)。注意,Pi 可以是负数,但如果它是很多高分宝物的前提,损失短期利益而吃掉这个负分宝物将获得更大的长期利益。

假设你采取最优策略,平均情况你一共能在奖励关得到多少分值?

输入格式:

第一行为两个正整数k 和n,即宝物的数量和种类。以下n行分别描述一种

宝物,其中第一个整数代表分值,随后的整数依次代表该宝物的各个前提宝物(各

宝物编号为1到n),以0结尾。

输出格式:

输出一个实数,保留六位小数,即在最优策略下平均情况的得分。

输入样例#1:

1 2
1 0
2 0

输出样例#1:

1.500000

输入样例#2:

6 6
12 2 3 4 5 0
15 5 0
-2 2 4 5 0
-11 2 5 0
5 0
1 2 4 5 0

输出样例#2:

10.023470

说明

1 <= k <= 100, 1 <= n <= 15,分值为[-106,106]内的整数。

题解

(思路其实和其他题解应该差不多,主要是一些更详细的理解)

首先有前提条件了,如果我们一个一个枚举的话又会很难存储状态,所以我们想到了状态压缩。

但是(亲身经历)如果我们以dp[ i ] [ j ]作为前i次抛出后在j状态下的话,我们会发现要多很多合法判定——j中设计的种类是否在i以内,枚举的前一个状态是否在i - 1以内,两个状态有没有冲突……很麻烦,而且总改不对。所以我们就熬考虑逆向思考——作为一个概率平均的期望题,可以想到求概率的时候有一个小技巧——正难则反。这里虽然不尽相同,但我们可以尝试一下——以dp[ i ] [ j ]作为前i - 1个物品后到达j状态,存i ~ k次抛出的最大期望。dp取max天然保证最大。也就是说,我们的最外层i的for循环将倒过来进行,这样就可以天然保证j状态是存在的,我们只考虑是否满足条件即可。而在我们使用状态压缩的前提下,比较条件就简单很多了,直接二进制操作,相信你也想得到:)

先上代码和详解——

#include<bits/stdc++.h>
#define maxn  105
using namespace std;
int n, K, v[maxn], cndtn[maxn];
double dp[maxn][1 << 18];
int main()
{scanf("%d%d", &K, &n);for(int i = 1; i <= n; i++){int temp = 1, c = 0;scanf("%d", &v[i]);while(temp)//二进制表示{scanf("%d", &temp);if(!temp) break;c += 1 << (temp - 1);//用|也可以。}cndtn[i] = c;}for(int i = K; i; i--)//逆向操作for(int j = 0; j < (1 << n); j++){for(int k = 1; k <= n; k++)//枚举物种{if((j & cndtn[k]) == cndtn[k])//该有的条件都有了dp[i][j] += max(dp[i + 1][j], dp[i + 1][j | (1 << k - 1)] + v[k]);//可要可不要else dp[i][j] += dp[i + 1][j];}    dp[i][j] /= n;//这里就要乘概率1/n,因为求的相当于同时发生的概率,要累乘}printf("%lf", dp[1][0]);return 0;
}//一份真的是简洁的过分的紫题代码

不知道你会不会有类似的问题——就是

dp[i][j] += max(dp[i + 1][j], dp[i + 1][j | (1 << k - 1)] + v[k]);

这一步中,j | (1 << k - 1)的话相当于一定找一个已经得到过k的状态进行转移,为什么不能从没有得到过k的状态转移过来呢?因为我们倒过来思考了。既然倒过来了,那么就一定不可能存在现在我得到了但是后来的状态中却显示没有得到,所以一定是从已经得到了的状态推进回来。逆向思考虽然可以省很多代码和细节问题的处理,但是思考的过程中也会有很多需要或者不需要跟随逆向思考而倒转的操作,所以这道题——难度还是不小。

迎评:)
——End——

四川2008省选·洛谷·奖励关相关推荐

  1. 【区间dp】洛谷 P1220 关路灯

    P1220 关路灯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 有一排路灯,老张有一个初始位置,他要把所有路灯都关掉.每个路灯都有各自的功率和坐标,问你关掉所有路灯所消耗 ...

  2. 洛谷P1220 关路灯(区间dp)

    关路灯 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯.为了给村里节 ...

  3. [洛谷]P1220 关路灯 (#区间dp)

    题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...

  4. 洛谷 P1220 关路灯(DFS)

    题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...

  5. 洛谷 P1220 关路灯 [动态规划做法]

    题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...

  6. Vijos——T 1016 北京2008的挂钟 || 洛谷—— P1213 时钟

    https://www.luogu.org/problem/show?pid=1213 题目描述 考虑将如此安排在一个 3 x 3 行列中的九个时钟: 目标要找一个最小的移动顺序将所有的指针指向12点 ...

  7. 洛谷 P2031 脑力达人之分割字串

    题目背景 好吧,该来的废话还是要来的. 画外音: 终于,在两轮的重重选拔之后,我们的海选终于结束了.现在进入我们的循环赛环节.循坏赛一共有四场,最后选出得分最高的16人进入对决,得分相同则和按用时排名 ...

  8. 【SCOI 2008】奖励关

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

  9. 信息学奥赛一本通 1919:【02NOIP普及组】选数 | 洛谷 P1036 [NOIP2002 普及组] 选数

    [题目链接] ybt 1919:[02NOIP普及组]选数 洛谷 P1036 [NOIP2002 普及组] 选数 [题目考点] 1.排列组合 2.深搜(子集树) 3.质数 [解题思路] 深搜(子集树) ...

最新文章

  1. linux系统启动过程(一)
  2. Qt控制台工程不能调试问题
  3. 构造函数为啥不能声明为虚函数
  4. Spark Streaming整合flume实战
  5. img 固定在父容器底部_容器苗容器怎么选?六种容器特点详解!
  6. 计算机应用作业2,计算机应用2作业
  7. c语言学习-将一个2*3的矩阵转置为3*2的矩阵
  8. 揭秘Facebook官方底层C++函数Folly
  9. ImageRanger 全萤幕检视操作说明
  10. risksystem_《环境风险评价系统(RiskSystem)》1.1版
  11. Kinetics数据集下载
  12. 一、zabbix与nagios对比
  13. “烧”不起原创欲减少成本投入,奈飞还能稳坐流媒体龙头宝座么?
  14. 8421 5421 2421 余3码
  15. 云呐|固定资产采购管理系统(资产采购管理有哪些功能)
  16. 用 Python 快速追踪基金的收益情况(2022年4月更新) | Python财经实践
  17. android读写删file,Android文件(File)操作
  18. B站左程云算法视频笔记05
  19. 生猛!实时把画质变成 4k 高清的神库!
  20. 2023年中国AI芯片行业市场现状及未来发展趋势预测

热门文章

  1. 「hdu6608」Fansblog 威尔逊定理
  2. 电子学会图形化一级编程题解析:字母AB点头问好
  3. python语言中整数1010的二进制是多少_10的二进制是多少哦啊?怎么算 O(∩_∩)O谢谢?...
  4. Codeforces 517 #A
  5. echart旭日图_旭日图(echarts)
  6. php活体检测,活体检测
  7. 吉米_王:MySQL开启log_bin日志,误删数据库时你最后的救命稻草
  8. 吉米_王:浅谈“并行计算”
  9. Ubuntu18.04安装Fcitx中文输入法
  10. 如何使用TensorFlow Hub和代码示例