【Luogu】P2489迷宫探险(概率DP)
设f[i][j][k][l]是当前在(i,j),对陷阱的了解状态为k(0表示了解该陷阱为无危险,1表示了解该陷阱有危险,2不了解),l表示当前血,走出迷宫的概率
dfsDP即可。 注意随时更新和细节。
#include<cstdio>
#include<cstdlib>
#include<cctype>
#include<algorithm>
#include<cstring>
#include<cmath>
#define maxn 200
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int u[]={,,,-,};
int w[]={,,-,,}; char mp[maxn][maxn]; double p[maxn];
double g[maxn*][maxn];
int pw[maxn]; int n,m,e,h; int getlens(int x,int len){ return x/pw[len-]%; } double f[][][maxn*][];
bool vis[][][maxn*][]; int chan(int x,int len,int nu){
return x-getlens(x,len)*pw[len-]+nu*pw[len-];
} void dfs(int x,int y,int state,int blo){
//printf("%d %d\n",x,y);
//printf("%d %d %d %d %.3lf\n",x,y,state,blo,f[x][y][state][blo]);
if(vis[x][y][state][blo]) return;
if(mp[x][y]=='@'){ f[x][y][state][blo]=; vis[x][y][state][blo]=; return; }
if(blo==){ f[x][y][state][blo]=; vis[x][y][state][blo]=; return; }
vis[x][y][state][blo]=;
double &ans=f[x][y][state][blo];
for(int i=;i<;++i){
int nx=x+u[i],ny=y+w[i];
if(nx<||nx>n||ny<||ny>m||mp[nx][ny]=='#') continue;
char c=mp[nx][ny];
int now=c-'A'+;
if(c=='.'||c=='$'||c=='@'||(now>=&&now<=e&&getlens(state,now)==)){
dfs(nx,ny,state,blo);
ans=max(ans,f[nx][ny][state][blo]);
}
//if(now<1||now>e) continue;
if(now>=&&now<=e&&getlens(state,now)==){
dfs(nx,ny,state,blo-);
ans=max(ans,f[nx][ny][state][blo-]);
}
if(now>=&&now<=e&&getlens(state,now)==){
int sta=chan(state,now,);
int stb=chan(state,now,);
dfs(nx,ny,sta,blo-);
dfs(nx,ny,stb,blo); ans=max(ans,g[state][now]*f[nx][ny][sta][blo-]+(1.0-g[state][now])*f[nx][ny][stb][blo]);
}
}
f[x][y][state][blo]=ans;
return;
} int main(){
int sx,sy;
n=read(),m=read(),e=read(),h=read();
for(int i=;i<=n;++i){
scanf("%s",mp[i]+);
for(int j=;j<=m;++j)
if(mp[i][j]=='$'){
sx=i; sy=j;
}
}
for(int i=;i<(<<e);++i) p[i]=read();
int Max=;pw[]=;
for(int i=;i<=e;++i) pw[i]=pw[i-]*;
//printf("%d",Max);
for(int i=;i<=pw[e];++i){
int sum=;
for(int j=;j<(<<e);++j){
bool flag=;
for(int k=;k<=e;++k){
int now=getlens(i,k),ret=(j>>k-)&;
if(now==) continue;
if(now!=ret){
flag=;
break;
}
}
if(flag) continue;
sum+=p[j];
for(int k=;k<=e;++k){
if(getlens(i,k)!=||((j>>k-)&)==) continue;
g[i][k]+=p[j];
}
}
for(int j=;j<=e;++j) g[i][j]/=sum;
} dfs(sx,sy,pw[e]-,h);
printf("%.3lf",f[sx][sy][pw[e]-][h]);
return ;
}
【Luogu】P2489迷宫探险(概率DP)的更多相关文章
- P2489 [SDOI2011]迷宫探险 概率dp
LINK:迷宫探险 题目中要求在最优的策略下的最大概率 而并非期望概率. 一个坑点 题目中虽然没有明说 但是 探险者是知道地图的模样和每个陷阱的概率的. 所以才有最优策略一说. 最优策略尽管不知道可以 ...
- BZOJ2707 [SDOI2012]走迷宫 【概率dp + tarjan + 高斯消元】
题目 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发的 ...
- luogu 1850 换教室 概率+dp
非常好的dp,继续加油练习dp啊 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) ...
- BZOJ2246 [SDOI2011]迷宫探险 【记忆化搜索dp + 概率】
题目 输入格式 输出格式 仅包含一个数字,表示在执行最优策略时,人物活着走出迷宫的概率.四舍五入保留3位小数. 输入样例 4 3 3 2 .$. A#B A#C @@@ 143 37 335 85 9 ...
- luogu P6835 概率DP 期望
luogu P6835 概率DP 期望 洛谷 P6835 原题链接 题意 n + 1个节点,第i个节点都有指向i + 1的一条单向路,现在给他们添加m条边,每条边都从一个节点指向小于等于自己的一个节点 ...
- hdu 4035 2011成都赛区网络赛E 概率dp ****
太吊了,反正我不会 /* HDU 4035 dp求期望的题. 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点 ...
- [转]概率DP总结 by kuangbin
概率类题目一直比较弱,准备把kuangbin大师傅总结的这篇题刷一下! 我把下面的代码换成了自己的代码! 原文地址:http://www.cnblogs.com/kuangbin/archive/20 ...
- HDU 4035Maze(概率DP)
HDU 4035 Maze 体会到了状态转移,化简方程的重要性 题解转自http://blog.csdn.net/morgan_xww/article/details/6776947 /** dp ...
- 【BZOJ2246】[SDOI2011]迷宫探险(搜索,动态规划)
[BZOJ2246][SDOI2011]迷宫探险(搜索,动态规划) 题面 BZOJ 洛谷 题解 乍一看似乎是可以求出每个东西是陷阱的概率,然而会发现前面走过的陷阱是不是陷阱实际上是会对当前状态产生影响 ...
随机推荐
- 【Java】Maven安装、Eclipse配置以及相关错误解决集合
作者呕血总结,下面写的每一个错误我都遇过 · Maven安装 · Eclipse配置 · Maven安装 安装前请确保已经装有JDK. 一. 准备Maven程序包 到官网https://maven.a ...
- BZOJ3884: 上帝与集合的正确用法(欧拉函数 扩展欧拉定理)
Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 3860 Solved: 1751[Submit][Status][Discuss] Descripti ...
- 洛谷P4316 绿豆蛙的归宿(期望)
题意翻译 「Poetize3」 题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出 ...
- java 基础面试
1. &和&&的区别 答: &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and) 2.int 和 Integer 有什么区别 答: Ja ...
- fastadmin 后台管理框架使用技巧(持续更新中)
fastadmin 后台管理框架使用技巧(持续更新中) FastAdmin是一款基于ThinkPHP5+Bootstrap的极速后台开发框架,具体介绍,请查看文档,文档地址为:https://doc. ...
- Redis ---------- key的操作
key命名规则 除空格和\n,其他都可以 select db -index选择数据库 例1 select 5 例2 type 查看数据key类型 type name 例3 keys pat ...
- PHP CodeIgniter框架实现读写分离
一.目标 当前服务器只做了主从,未配置读写分离,读写分离的功能就只有交给程序来实现,本文主要谈谈Codeigniter怎么实现读写分离,并且需要满足以下两点: 1.读写分离对开发应该透明. 网上有方案 ...
- <Docker学习>2.Centos7安装docker
Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10. CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功能(如 overlay2 存储层驱动)无 ...
- MLT教程:从BXL文件导入Altium Designer原理图封装和PCB封装
在TI官网的封装文件中提供弄BXL文件可以导出Altium Designer的封装库和原理图库. 这个界面往下面拉会看到: 然后可以下载各种封装的bxl文件了.下面视频说明bxl文件如何导出成功. 如 ...
- PHP.25-TP框架商城应用实例-后台2-商品列表页-搜索、翻页、排序
商品列表页 1.翻页 控制器GoodsController.class.php添加方法lst(),显示列表页 在商品模型GoodsModel.class.php类中添加search方法 /** *实现 ...