天上掉馅饼
(bonus)
题目描述
小G进入了一个神奇的世界,在这个世界,天上会掉下一些馅饼。今天,天上会随机掉下k个馅饼。
每次天上掉下馅饼,小G可以选择吃或者不吃(必须在下一个馅饼掉下来之前作出选择,并且现在决定不吃的话以后也不能吃)。
馅饼有n种不同的馅,根据物理定律,天上掉下这n种馅饼的概率相同且相互独立。然而,每一种馅饼i都有一个前提馅饼集合Si。只有当 Si 中的馅饼都吃过之后,才能吃第i种馅饼。比如说,韭菜馅馅饼的S中有白菜猪肉馅饼和鲜虾馅饼,那么小G只有在吃过白菜猪肉馅饼和鲜虾馅饼之后,才能吃韭菜馅的馅饼。
同时,每个馅饼还有一个美味值Pi。今天一天小G的幸福度,等于小G吃到的所有馅饼的美味值之和。注意:Pi 可能是负数。
现在考虑,采用最优策略的前提下,小G这一天期望的幸福度是多少?
输入格式(bonus.in)
第一行两个正整数k和n,表示馅饼的数量和种类。
以下n行,每行若干个数,描述一种馅饼。其中第一个数代表美味值,随后的整数表示该馅饼的前提馅饼,以0结尾。
输出格式(bonus.out)
输出一个实数,保留6位小数,即在最优策略下期望的幸福度。
输入样例
1 2
1 0
2 0
1 2 0 2
输出样例
1.500000
数据范围
对于20% 的数据,所有的馅饼都没有“前提馅饼”。
对于50% 的数据,1 ≤ k ≤ 10,1 ≤ n ≤ 10。

对于100%的数据,1 ≤ k ≤ 100,1 ≤ n ≤ 15,美味度为[-106; 106]的整数。

题解:对于每一种馅饼,用二进制位上的1来表示是否出现,由于前面是否吃某种馅饼对后面吃某些馅饼是有影响的,所以采用倒着推的方式。倒着推的dp基本可以用记忆化搜索,当前状态扩展出其他状态,由于最终扩展出来的状态非常多不好统计答案,所以才有回溯时从末状态返回初状态。

总结:倒着推的dp通常都可以记忆化搜索,其实dp就是记忆化搜索,理论上dfs可以替代dp,但一定要搞清楚记忆的是什么,值得注意的是没记录状态是否已经计算过一定要用bool类型进行判断,不能通过该状态是否有值来判断(超时)(很玄学)。

记忆化搜索:

//记忆化dfs代替状态压缩dp倒着推
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
int n,t;
using namespace std;
int date[20][20],num[20],val[20];
double dp[200][500000];
int pre[2000];
bool vis[200][300000];
double dfs(int dep,int mat_)
{if(vis[dep][mat_]) return dp[dep][mat_];//非常重要的剪枝!!!if(dep>t) return 0.00;vis[dep][mat_]=1;for(int i=1;i<=n;i++) if( ( mat_ & pre[i] ) == pre[i] ) {if(val[i]>=0) dp[dep][mat_]+=(double)(dfs(dep+1,mat_|(1<<(i-1)))+(double)val[i]);else dp[dep][mat_] += max( dfs(dep+1,mat_) , (double)( dfs(dep+1,(mat_|(1<<(i-1))) ) + (double)val[i]) );}else dp[dep][mat_]+=dfs(dep+1,mat_);dp[dep][mat_]/=(double)n;return dp[dep][mat_];
}int main()
{
//  freopen("bonus.in","r",stdin);
//  freopen("bonus.out","w",stdout);memset(pre,0,sizeof(pre));int x;scanf("%d %d",&t,&n);for(int i=1;i<=n;i++){scanf("%d",&val[i]);while(scanf("%d",&x) && x) pre[i] |= (1<<(x-1));}printf("%.6lf",dfs(1,0));return 0;
}/*
44 15
-221964 12 9 0
558098 3 9 0
-765634 4 8 12 10 5 0
-113034 9 0
711128 6 12 0
-610384 12 0
-280873 13 6 10 0
705891 11 5 10 9 0
112653 6 10 0
-635146 5 8 2 15 3 0
-85056 4 0
-196879 0
105600 0
768292 5 11 7 0
-328587 4 0
*/

dp:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define N 500000
using namespace std;
double dp[105][N];
int pre[20],val[20];
int t,n;
int main()
{
//  freopen("bonus.in","r",stdin);
//  freopen("bonus.out","w",stdout);int x;scanf("%d%d",&t,&n);for(int i=1;i<=n;i++){scanf("%d",&val[i]);while(scanf("%d",&x) && x) pre[i]|=(1<<(x-1));}for(int i=1;i<=t;i++)for(int j=0;j < (1<<n);j++){for(int k=1;k<=n;k++)if( (pre[k]&j) == pre[k] ) dp[i][j]+=max(dp[i-1][j],dp[i-1][j|(1<<(k-1))]+(double)val[k]);else dp[i][j]+=dp[i-1][j];dp[i][j]/=(double)n;}printf("%.6lf",dp[t][0]);return 0;
} 

天上掉馅饼 期望dp+状压dp相关推荐

  1. 【BZOJ】1076 [SCOI2008]奖励关 期望DP+状压DP

    [题意]n种宝物,k关游戏,每关游戏给出一种宝物,可捡可不捡.每种宝物有一个价值(有负数).每个宝物有前提宝物列表,必须在前面的关卡取得列表宝物才能捡起这个宝物,求期望收益.k<=100,n&l ...

  2. 天上掉馅饼 期望DP

    C 天上掉馅饼 文件名 输入文件 输出文件 时间限制 空间限制 bonus.pas/c/cpp bonus.in bonus.out 1s 128MB 题目描述 小 G 进入了一个神奇的世界,在这个世 ...

  3. [转]状态压缩dp(状压dp)

    状态压缩动态规划(简称状压dp)是另一类非常典型的动态规划,通常使用在NP问题的小规模求解中,虽然是指数级别的复杂度,但速度比搜索快,其思想非常值得借鉴. 为了更好的理解状压dp,首先介绍位运算相关的 ...

  4. SCUT - 254 - 欧洲爆破 - 概率dp - 状压dp

    https://scut.online/p/254 思路很清晰,写起来很恶心. #include<bits/stdc++.h> using namespace std; #define l ...

  5. bzoj4455 loj2091 [Zjoi2016]小星星 容斥原理+树形DP(+状压DP?)

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4455 https://loj.ac/problem/2091 题解 很不错的一道题.(不过在当 ...

  6. 状压dp个人刷题记录

    目录 一.普通型 蒙德里安的梦想 题意: 思路: code: #2153. 「SCOI2005」互不侵犯 题意: 思路: code: P1879 [USACO06NOV]Corn Fields G 题 ...

  7. 中石油训练赛 - Watch Later(状压dp)

    题目链接:点击查看 题目大意: 给出一个长度为 n 的字符串,字符串中共有 k 种不同的字符,现在问删除掉所有字符的最小操作数,对于每种字符需要确定一个先后顺序,每次需要删除掉当前所有的这种字符才能去 ...

  8. [ NOIP提高组 2016]愤怒的小鸟(暴搜 + 状压DP)// [SNOI2017]一个简单的询问(莫队)

    一次性写两道题 T1:一个简单的询问 题目 题解 代码实现 T2:愤怒的小鸟 题目 暴搜题解 暴搜代码实现 状压DP题解 状压DP代码实现 T1:一个简单的询问 题目 给你一个长度为 N 的序列 ai ...

  9. 【状压DP】滚榜(P7519)

    正题 P7519 题目大意 n个队伍,排名先按分数排序再按编号排序,每个队伍有一个初始分数 aia_iai​,和一个附加分数 bib_ibi​ 对于一个合法的 bib_ibi​ 序列,按 bib_ib ...

最新文章

  1. 开源项目贡献者_嘿新手开源贡献者:请写博客。
  2. python 自学需要多久-怎么自学python,大概要多久?
  3. 查询优化器内核剖析第四篇:从一个实例看执行计划
  4. python实训目的意义_Python实训第二天--基础知识2
  5. 清空临时表oracle,【Oracle相关】Oracle中如何清空临时表空间
  6. 如何实现单链表交换任意两个元素(不包括头结点)
  7. ActionT 委托
  8. flutter实现Icon可以用Image替换
  9. 学习使用资源文件[4] - 用资源中的图片做背景、使用 LoadFromResourceID
  10. 非酋用计算机弹唱,非酋简谱 薛明媛/朱贺 听说爱情就是这样子
  11. WMS系统中仓库条形码管理的优势
  12. 计算机如何连接网络扫描仪,windows系统下怎么共享扫描仪?
  13. 全国计算机二级证书NO00000,计算机二级成绩查询
  14. latex如何生成pdf标签/目录?
  15. 设计模式中的七大原则(代码 + 图解)
  16. jquery抓娃娃机代码
  17. 国外数据挖掘方面的经典博客
  18. 递推算法6——逆推法之存取问题
  19. Spring 发生 has not been refreshed yet 异常
  20. 若A为病态矩阵,B与A相似, 那么矩阵B是否也是病态矩阵?

热门文章

  1. 盘点四款免费在线采购管理系统
  2. 瑞士天梭表于纽约、上海、东京、新加坡四地揭幕六家限时主题店
  3. 洛谷P2839 [国家集训队]middle(主席树)
  4. 亚马逊英国站自动洒水器、自动浇花器UKCA认证检测标准
  5. 安装realtek hd audio失败0xe0000247如何解决?
  6. MODIS数据处理工具MODIS Reprojection Tool(MRT)介绍
  7. 贝叶斯估计(概率密度函数的估计的参数方法)
  8. 编程挑战JavaScript进阶篇(慕课网题目)
  9. 用户第一 体验为王 Irontech Doll创始人Leonard的性趣生意之道
  10. dw常用标签_Dreamweaver里标签及属性详解