Description

题目链接

Solution

用三进制表示陷阱状态,1表示有害,2表示无害,0表示不知道

用\(f[S][i]\)表示状态为S时陷阱i有害的概率,这个可以预处理出

\(d[S][i][j][h]\)表示状态为S,在坐标\((i,j)\),血量为h时的答案

然后就可以DP了,记忆化搜索

Code

#include <cstdio>
#include <algorithm>
#define db double
#define Sta 300
#define N 36
using namespace std; const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};
db dp[Sta][N][N][6],f[Sta][N];
int n,m,k,h,p[N],sx,sy,A[6];
char g[N][N]; inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
} db tmp[2];
void dfs(int x){
if(x==k){
int S=0;
for(int i=k-1;i>=0;--i) S=S*3+A[i];
for(int i=0;i<k;++i){
if(A[i]!=2) continue;
tmp[0]=tmp[1]=0;
for(int j=0;j<(1<<k);++j){
bool flag=0;
for(int l=0;l<k;++l)
if(A[l]==2) continue;
else if(A[l]!=((j>>l)&1)){flag=1;break;}
if(flag) continue;
tmp[(j>>i)&1]+=p[j];
}
f[S][i]=tmp[1]/(tmp[1]+tmp[0]);
}
}else for(int i=0;i<=2;++i){A[x]=i;dfs(x+1);}
} int Change(int S,int pos,int x){
for(int i=0;i<pos;++i) A[i]=S%3,S/=3;S-=x;
for(int i=pos-1;i>=0;--i) S=S*3+A[i];
return S;
} db DP(int S,int x,int y,int h){
if(!h) return 0;
if(g[x][y]=='@') return 1;
db &tmp=dp[S][x][y][h];
if(tmp!=-1) return tmp;
tmp=0; for(int d=0;d<4;++d){
int nx=x+dx[d],ny=y+dy[d],tS=S;
if(nx<=0||ny<=0||nx>n||ny>m) continue;
char ch=g[nx][ny];
if(ch=='#') continue;
else if(ch=='.'||ch=='$'||ch=='@') tmp=max(tmp,DP(S,nx,ny,h));
else if(ch>='A'&&ch<='Z'){
int id=ch-'A';
for(int i=0;i<id;++i) tS/=3;
if(tS%3==2) tmp=max(tmp,DP(Change(S,id,2),nx,ny,h)*(1-f[S][id])+DP(Change(S,id,1),nx,ny,h-1)*f[S][id]);
else tmp=max(tmp,DP(S,nx,ny,h-(tS%3)));
}
}
return tmp;
} int main(){
n=read(),m=read(),k=read(),h=read();
for(int i=1;i<=n;++i) scanf("%s",g[i]+1);
for(int i=0;i<(1<<k);++i) scanf("%d",&p[i]);
for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)if(g[i][j]=='$'){sx=i;sy=j;break;}
int tot=1;for(int i=1;i<=k;++i)tot*=3;--tot;
dfs(0);
for(int i=0;i<Sta;++i)for(int j=1;j<N;++j)for(int k=1;k<N;++k)for(int l=0;l<6;++l)dp[i][j][k][l]=-1;
printf("%.3lf\n",DP(tot,sx,sy,h));
return 0;
}

[Bzoj2246]迷宫探险(概率+DP)的更多相关文章

  1. P2489 [SDOI2011]迷宫探险 概率dp

    LINK:迷宫探险 题目中要求在最优的策略下的最大概率 而并非期望概率. 一个坑点 题目中虽然没有明说 但是 探险者是知道地图的模样和每个陷阱的概率的. 所以才有最优策略一说. 最优策略尽管不知道可以 ...

  2. BZOJ2707 [SDOI2012]走迷宫 【概率dp + tarjan + 高斯消元】

    题目 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发的 ...

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

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

  4. 【Luogu】P2489迷宫探险(概率DP)

    题目链接 设f[i][j][k][l]是当前在(i,j),对陷阱的了解状态为k(0表示了解该陷阱为无危险,1表示了解该陷阱有危险,2不了解),l表示当前血,走出迷宫的概率 dfsDP即可. 注意随时更 ...

  5. 【BZOJ2246】[SDOI2011]迷宫探险(搜索,动态规划)

    [BZOJ2246][SDOI2011]迷宫探险(搜索,动态规划) 题面 BZOJ 洛谷 题解 乍一看似乎是可以求出每个东西是陷阱的概率,然而会发现前面走过的陷阱是不是陷阱实际上是会对当前状态产生影响 ...

  6. hdu 4035 2011成都赛区网络赛E 概率dp ****

    太吊了,反正我不会 /* HDU 4035 dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点 ...

  7. [转]概率DP总结 by kuangbin

    概率类题目一直比较弱,准备把kuangbin大师傅总结的这篇题刷一下! 我把下面的代码换成了自己的代码! 原文地址:http://www.cnblogs.com/kuangbin/archive/20 ...

  8. HDU 4035Maze(概率DP)

    HDU 4035   Maze 体会到了状态转移,化简方程的重要性 题解转自http://blog.csdn.net/morgan_xww/article/details/6776947 /** dp ...

  9. LOOPS 概率dp

    题意:迷宫是一个R*C的布局,每个格子中给出停留在原地,往右走一个,往下走一格的概率,起点在(1,1),终点在(R,C),每走一格消耗两点能量,求出最后所需要的能量期望 简单概率dp 注意   原地不 ...

随机推荐

  1. tp3.2水印上传文件

    <html> <html lang="en"><head>    <meta charset="UTF-8">  ...

  2. 秒懂JSON.parse()与JSON.stringify()的区别

    在网站开发中,Json是最为常见的一种数据交互手段.在使用过程中,常会遇到Json字段串和对象之间进行转换.很多朋友对于JSON.parse() 和JSON.stringify() 的区别,下面为大家 ...

  3. ASP.NET MVC 音乐商店 - 1 创建项目

    我们的项目从在 Visual Studio 中的文件菜单中选择“新建”,选择“项目”开始. 然后,选择 C# 中的 Web 模板组,在右边的项目模板中选择 ASP.NET MVC3 Web 应用程序, ...

  4. chrome浏览器设置12px以下字体大小

    内容很简单 在 body 上添加一个 css 属性即可. .body { -webkit-text-size-adjust: none; } 结束,晚安!

  5. TP5.1:依赖注入、绑定一个类到容器里、绑定一个闭包到容器中

    依赖注入 1.在application中创建一个文件夹,名字为commom,commom文件夹中创建被注入文件夹,在被注入文件夹中创建一个名为demo.php的文件 2.在demo.php中输入: 3 ...

  6. IOS 解析XML数据

    ●  什么是XML ●  全称是Extensible Markup Language,译作“可扩展标记语言” ●  跟JSON一样,也是常用的一种用于交互的数据格式 ●  一般也叫XML文档(XML ...

  7. 如何实现SQL Server临时表的创建?

    以下的文章主要是对SQL Server临时表的创建的实际操作步骤,以及在实际操作中我们要用到的实际应用代码的介绍,我在一个信誉度很好的网站找到一个关于其相关内容今天拿出来供大家分享. 创建临时表 方法 ...

  8. 位图算法-hash算法的后继应用

    判断集合中存在重复是常见编程任务之一,当集合中数据量比较大时我们通常希望少进行几次扫描,这时双重循环法就不可取了.位图法比较适合于这种情况,它的做法是按照集合中最大元素max创建一个长度为max+1的 ...

  9. 模拟插队,出队,POJ(2259)

    题目链接:http://poj.org/problem?id=2259 水题一个,就是要记录一下每个队列是否有人bool[i], #include <iostream> #include ...

  10. 2月4号学习的一个SSM整合项目,第一课

    本文引自:https://github.com/Sunybyjava/seckill  原作者:sunybyjava@gmail.com seckill 一个整合SSM框架的高并发和商品秒杀项目,学习 ...