题目链接

求最大的存活概率,DP+记忆化。
用f[s][x][y][hp]表示在s状态,(x,y)点,血量为hp时的存活概率。
s是个三进制数,记录每个陷阱无害/有害/未知。
转移时比较容易,主要是在陷阱未知时需要知道当前状态这个陷阱为有害/无害的概率,并用这两个概率相加。
如何求某个状态下未知陷阱是否有害的概率呢(以下求有害概率,即 有害/(有害+无害))
DFS枚举每个陷阱已知有害/无害/未知的状态,我们需要处理未知陷阱在该状态下的概率。
枚举每个未知的陷阱,再枚举2^K的概率数组,只有当满足所有已知陷阱的状态时(未知的有/无解都加),才可以更新当前陷阱有害/无害的概率。

这个概率数组感觉比较迷啊。。是K个陷阱满足该状态时的概率。
注意: 再回到一个点(如起点)是可行的!不要随便剪。。

//15480kb   156ms
#include <cstdio>
#include <cctype>
#include <algorithm>
const int N=33,to[5]={1,0,-1,0,1};int n,m,K,K_2,H,pi[N],sta[6];
double P[255][6],tmp[2],f[N][N][6][255];
bool vis[N][N][6][255];
char mp[N][N];void DFS(int x)
{if(x==K){int now=0;for(int i=K-1; ~i; --i) now=now*3+sta[i];for(int p=0; p<K; ++p)if(sta[p]==2){tmp[0]=tmp[1]=0;//该陷阱有害/无害的概率 for(int i=0; i<K_2; ++i){bool f=1;for(int j=0; j<K; ++j)if(sta[j]==2) ;else if(((i>>j)&1)!=sta[j]) {f=0; break;}if(f) tmp[(i>>p)&1]+=pi[i];//!}P[now][p]=tmp[1]/(tmp[0]+tmp[1]);}}else{sta[x]=0, DFS(x+1);sta[x]=1, DFS(x+1);sta[x]=2, DFS(x+1);}
}
inline int Change(int s,int p,int to)
{int t=1; while(p--) t*=3;return s-(2-to)*t;
}
#define Now f[x][y][hp][s]
double Solve(int x,int y,int hp,int s)
{if(!hp) return 0;if(mp[x][y]=='@') return 1.0;if(vis[x][y][hp][s]) return f[x][y][hp][s];vis[x][y][hp][s]=1;//状态比较多不好判重啊。。直接在这设vis=1.for(int xn,yn,i=0; i<4; ++i){xn=x+to[i], yn=y+to[i+1];if(!xn||!yn||xn>n||yn>m||mp[xn][yn]=='#') continue;char ch=mp[xn][yn];if(ch=='.'||ch=='@'||ch=='$') Now=std::max(Now,Solve(xn,yn,hp,s));else if(isalpha(ch)){int ts=s,id=ch-'A';for(int t=id; t; --t) ts/=3;if(!(ts%3)) Now=std::max(Now,Solve(xn,yn,hp,s));else if(ts%3==1) Now=std::max(Now,Solve(xn,yn,hp-1,s));else Now=std::max(Now,Solve(xn,yn,hp-1,Change(s,id,1))*P[s][id]+Solve(xn,yn,hp,Change(s,id,0))*(1-P[s][id]));}}return Now;
}int main()
{scanf("%d%d%d%d",&n,&m,&K,&H);int sx=0,sy;for(int i=1; i<=n; ++i){scanf("%s",mp[i]+1);if(!sx){for(int j=1; j<=m; ++j)if(mp[i][j]=='$') sx=i,sy=j;}}K_2=1<<K;for(int i=0; i<K_2; ++i) scanf("%d",&pi[i]);DFS(0);int sta=1;for(int i=K; i; --i) sta*=3;
//  int sta=0;
//  for(int i=K; i; --i) sta=sta*3+2;printf("%.3lf",Solve(sx,sy,H,sta-1));return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/8688493.html

BZOJ.2246.[SDOI2011]迷宫探险(DP 记忆化搜索 概率)相关推荐

  1. BZOJ2246 [SDOI2011]迷宫探险 【记忆化搜索dp + 概率】

    题目 输入格式 输出格式 仅包含一个数字,表示在执行最优策略时,人物活着走出迷宫的概率.四舍五入保留3位小数. 输入样例 4 3 3 2 .$. A#B A#C @@@ 143 37 335 85 9 ...

  2. BZOJ 2246 [SDOI2011]迷宫探险 ——动态规划

    概率DP 记忆化搜索即可,垃圾数据,就是过不掉最后一组 只好打表 #include <cstdio> #include <cstring> #include <iostr ...

  3. BZOJ 2246 [SDOI2011]迷宫探险 (记忆化搜索)

    题目大意:太长了,略 bzoj luogu 并没有想到三进制状压 题解: 3进制状压陷阱的状态,0表示这种陷阱的状态未知,1已知危险,2已知不危险 然后预处理出在当前状态下,每种陷阱有害的概率,设为$ ...

  4. DP\记忆化搜索-牛客寒假集训营3-牛牛的DRB迷宫I

    DP-牛客寒假集训营3-牛牛的DRB迷宫I 题目: 题意: 求迷宫问题的方案数量.与--求迷宫问题的方案数量.与--求迷宫问题的方案数量.与--DP题型总结中的<摘花生>类似.中的< ...

  5. 思维dp ---- Codeforces Round #711 (Div. 2) - C. Planar Reflections[dp/记忆化搜索]

    题目链接 题目大意: 就是给你n个平面和一个寿命为k的衰变粒子.开始粒子从左向右飞行,粒子每经过一个平面就会产生一个副本粒子,这个副本粒子比原粒子的寿命少1,即为k-1,并且飞行方向是原粒子的反方向. ...

  6. BZOJ1415 [Noi2005]聪聪和可可 【SPFA + 期望dp记忆化搜索】

    题目 输入格式 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2行包含两个整数C和M,以空格分隔,分别表示初始时聪聪和可可所在的景点的编号. 接下来E行 ...

  7. HDU 5001 概率DP || 记忆化搜索

    2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP  測 ...

  8. 数位dp 记忆化搜索java_hdu 5787 数位dp,记忆化搜索

    题意:求区间[l,r]内有多少个数符合,这个数的任意的相邻k位数(digits),这k个数都两两不相等 l,r范围是1~1e18,k是2~5 思路:数位DP,因为K<=5,我们最多需要保存下来当 ...

  9. pku 1191 棋盘分割 DP / 记忆化搜索

    http://poj.org/problem?id=1191 题意:中文省略. 思路:黑说p116有讲解, 主要的状态转移方程为 横着切: dp[k][x1][y1][x2][y2]  = min(d ...

最新文章

  1. 英文字母大写 html,英文大小写格式
  2. vue-cli的webpack模板项目配置文件分析
  3. 长方形纸做容积最大的长方体_儿童手工折纸,童年玩具纸扇子怎么折?一起来回忆下经典折法吧...
  4. k8s pod重启策略:Always、OnFailure、Never配置示例
  5. 部署war包后,新增tomcat服务器,启动tomcat服务器报错解决方法
  6. darknet编译报错 error: ‘__fatBinC_Wrapper_t’ does not name a type
  7. Java基础学习(3)-泛型
  8. Android okhttp https TrustManager简单总结
  9. 安装linux版qq,安装二进制包编译器,安装mysql-5.6.11,删除已安装或安装失败的mysql-5.6.11,简单mysql练习题...
  10. 构建自己的不可替代性
  11. 空洞卷积(扩张卷积dilated convolution)
  12. 应用程序无法正常启动(0xc0150002)
  13. 一周热图|何穗俞飞鸿张翰南京出席活动;华为全球最大旗舰店开业;巴黎欧莱雅公布凯瑟琳·兰福德为全球代言人...
  14. 计算机专业相关的国家认证,国内认证的计算机证书有哪些?
  15. panic: interface conversion: interface {} is nil, not chan *sarama.ProducerError
  16. 汉锐4K广播专业会议摄像机
  17. 去哪儿cli2项目总结
  18. 浅谈数字化管道建设-胜利油田集输信息中心
  19. SAP 采购订单PO基于采购金额的审批策略配置
  20. 月销涨3倍:阿里巴巴零售通联合饿了么宣布将赋能近万天猫小店

热门文章

  1. (转)页游安全攻与防,SWF加密和隐藏密匙
  2. 经常忘记的--jsp被转成servlet放在哪个目录下呢 2、日志路径3、AdminServer.lok
  3. c语言二维数组找鞍点,C语言,二维数组 找鞍点
  4. 泛洪攻击以及防护方法
  5. 【NOI2005】 瑰丽华尔兹
  6. 电脑显示无法启动程序 因为计算机丢失,电脑显示无法启动此程序丢失.dll文件怎么办...
  7. 01_我为什么想要成为一名前端工程师
  8. csdn简单设置字体颜色
  9. python输出带颜色的字体
  10. chrome extension 普通网页与插件直接通信