【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 洛谷 题解 乍一看似乎是可以求出每个东西是陷阱的概率,然而会发现前面走过的陷阱是不是陷阱实际上是会对当前状态产生影响 ...
随机推荐
- WebAppBuilder独立于Portal之arcgis for js应用框架研究
1.前言 最近在做项目过程中,用到了WAB,先做一下总结和归类.Webappbuilder(简称WAB)是运行在portal或者online的一款webGIS开发应用程序,其代码开源并且具有优秀的设计 ...
- C# CheckBoxList 实现全选/反选功能怎么写?
首先我们用RadioButtonList控件,且必须包含OnSelectedIndexChanged事件和AutoPostBack=‘true’属性, <asp:LinkButton ID=&q ...
- MacBookPro 存储空间优化
首先,打开电脑内的"终端"; 其次,逐条录入下面的命令行,执行完成后,再次查看您的储存空间,多少会有一些优化,具体会优化出多少储存空间因您日常使用而定(本人清出了5G 空间,还不错 ...
- springboot整合mybatis笔记
1首先创建一个springboot项目 创建项目的文件结构以及jdk的版本 选择项目所需要的依赖 之后点击finish,完成创建 2以下是文件结构 看一下啊pom.xml; <?xml vers ...
- SSH 登录时出现如下错误:No supported key exchange algorithms
https://help.aliyun.com/knowledge_detail/41486.html
- 多进程(multiprocessing module)
一.多进程 1.1 多进程的概念 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了非常好 ...
- java基础不牢固容易踩的坑
java基础不牢固容易踩的坑 经过一年java后端代码以及对jdk源码阅读之后的总结,对java中一些基础中的容易忽略的东西写下来,给偏爱技术热爱开源的Coder们分享一下,避免在写代码中误入雷区. ...
- Redis数据库 : python与java操作redis
redis 包 from redis import * 连接: r = StrictRedis(host='localhost', port='6379') 读写:r.set('key','value ...
- Centos7安装Mysql5.7并修改初始密码
1.CentOS 的yum源中没有mysql,需要到mysql的官网下载yum repo配置文件. wget https://dev.mysql.com/get/mysql57-community-r ...
- jQuery-laye插件实现 弹框编辑,异步验证,form验证提交
代码中用到了 jQuery的ajax异步处理,each()循环,submit()页面验证提交form表单,prepend()追加标签,laye插件的弹框效果(如有其它弹框效果可参考官网:http:// ...