【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 洛谷 题解 乍一看似乎是可以求出每个东西是陷阱的概率,然而会发现前面走过的陷阱是不是陷阱实际上是会对当前状态产生影响 ...
随机推荐
- 多进程(multiprocessing module)
一.多进程 1.1 多进程的概念 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了非常好 ...
- javascript中string对象方法中的slice、substring、substr的区别联系
1.slice.substring.snustr均属于String的对象方法,用于截取或提取字符串片段,三者均布破坏原先的字符串,而是以新的字符串返回被提取的部分. <script> va ...
- css设置内容超出后显示省略号
1.使用overflow: hidden把超出的内容进行隐藏: 2.然后使用white-space: nowrap设置内容不换行: 3.最后使用text-overflow: ellipsis设置超出内 ...
- 数据分析处理库Pandas——对象操作
Series结构 索引 修改 旧数据赋值给新数据,旧数据不变. 对某一数值进行修改,可以选择保留修改前或修改后的数值. 替换索引 修改某一个索引 添加 在数据1后添加数据2,数据1不改变. 添加一个数 ...
- redis学习1(nosql)
一. 互联网时代背景下大机遇,为什么用nosql 1.单机MySQL的美好年代 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付.在那个时候,更多的都是静态网页,动态交互类型的网站 ...
- POJ:3276-Face The Right Way(线性反转)
Face The Right Way Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 6259 Accepted: 2898 De ...
- 笔记-python-built-in functions-eval,exec,compile
笔记-python-built-in functions-eval,exec,compile 1. python代码执行函数 有时需要动态改变代码,也就是说代码需要是字符串格式,然后在按需要 ...
- 笔记-git-协作开发
笔记-git-协作开发 1. git协作开发 git协作的典型做法是,创建一个git服务器,被多个人操作. 示意图如下: 一般来说协作分为如下几个步骤: 创建一个git裸服务器 (git i ...
- 零基础~仿qq登录界面
html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...
- 2 js的20/80关键知识
1. 2 var a = 1; undefined a 1 alert(a); undefined var b = true; var c = "Hi"; undefined al ...