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

题面

BZOJ
洛谷

题解

乍一看似乎是可以求出每个东西是陷阱的概率,然而会发现前面走过的陷阱是不是陷阱实际上是会对当前状态产生影响的。考虑一下状压,因为出了是陷阱和不是陷阱,还有一种情况是未知。所以三进制状压。
\(0\)表示是有害陷阱,\(1\)表示不是,\(2\)表示未知。
那么假如我们知道了一个当前的三进制状态,如何确定当前的某个未知的陷阱是否有害的概率呢?
这个显然可以暴力提前预处理出来。
那么这就很好办了,设\(f[x][y][hp][S]\)表示当前在\((x,y)\)位置,剩余血量为\(hp\),当前陷阱的状态集合为\(S\)的最大概率。那么直接记忆化爆搜就可以知道结果了。
然而我觉得这个做法是假的,因为你转移的时候可能成环,这也就解释了为什么不按照题解的方向就过不了,然而不这么做还能怎么做啊QwQ。

似乎BZOJ上的数据有锅,怎么交都是T,我蒯别的题解也T了。。。。
然后我改成scanf就WA了,应该数据锅了,到洛谷交吧。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define cmax(a,b) (a=((a)<(b)?(b):(a)))
int bin[]={1,3,9,27,81,243,729,2187,6561};
int let(int x,int k){return x/=bin[k];}
int rit(int x,int k){return x*=bin[k];}
int get(int x,int k){x/=bin[k];return x%3;}
double f[35][35][729][10];
bool vis[35][35][729][10];
int n,m,K,H,P[50];
char g[35][35];
double p[729][10];
int bx,by,ex,ey;
int d[4][2]={1,0,0,-1,-1,0,0,1};
double dfs(int x,int y,int S,int hp)
{if(vis[x][y][S][hp])return f[x][y][S][hp];if(!hp)return f[x][y][S][hp]=0;if(g[x][y]=='@')return f[x][y][S][hp]=1;vis[x][y][S][hp]=true;for(int i=0;i<4;++i){int xx=x+d[i][0],yy=y+d[i][1];if(xx<1||yy<1||xx>n||yy>m)continue;if(g[xx][yy]=='#')continue;if(g[xx][yy]>='A'&&g[xx][yy]<='Z'){int k=g[xx][yy]-65;if(get(S,k)<2)//Knowcmax(f[x][y][S][hp],dfs(xx,yy,S,hp-get(S,k)));else//Unknowcmax(f[x][y][S][hp],dfs(xx,yy,S-bin[k],hp-1)*p[S][k]+dfs(xx,yy,S-bin[k]*2,hp)*(1-p[S][k]));}elsecmax(f[x][y][S][hp],dfs(xx,yy,S,hp));}return f[x][y][S][hp];
}
int main()
{scanf("%d%d%d%d",&n,&m,&K,&H);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]=='$')bx=i,by=j;else if(g[i][j]=='@')ex=i,ey=j;if(!ex){puts("0.000");return 0;}for(int S=0;S<bin[K];++S){int sumP=0;for(int i=0;i<1<<K;++i){bool fl=true;for(int j=0;j<K;++j){int x=get(S,j);if(x==2)continue;if(((i>>j)&1)!=x){fl=false;break;}}if(!fl)continue;sumP+=P[i];for(int j=0;j<K;++j)if(get(S,j)==2&&(i&(1<<j)))p[S][j]+=P[i];}for(int j=0;j<K;++j)p[S][j]/=sumP;}printf("%.3lf\n",dfs(bx,by,bin[K]-1,H));return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/9906442.html

【BZOJ2246】[SDOI2011]迷宫探险(搜索,动态规划)相关推荐

  1. bzoj2246: [SDOI2011]迷宫探险

    2246: [SDOI2011]迷宫探险 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 202  Solved: 118 [Submit][Stat ...

  2. BZOJ2246 SDOI2011 迷宫探险(状压+概率dp)

    题面太长了,贴起来好麻烦,走链接吧: P2489 [SDOI2011]迷宫探险 题目指向状压.自然地考虑用二进制表示状态,0为无害,1为有害.紧接着会发现,当我们走到某个点 ( x, y ) 时,我们 ...

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

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

  4. [BZOJ2246][SDOI2011]迷宫探险(状压概率DP)

    1.DP模型 用33进制数表示陷阱的状态,00表示无害,11表示有害,22表示未知.可建立DP模型: f[x][y][S][h]f[x][y][S][h]表示从(x,y)(x,y)开始,当前陷阱的状态 ...

  5. 【BZOJ2246】[SDOI2011]迷宫探险【搜索】【概率DP】

    [BZOJ2246] 最后一组数据没过,也不知道啥原因,打了发表(pia) 大体思路是,先搜索出每个状态下每个陷阱有害的概率,然后就可以跑dp了. 搜索时,每个陷阱有三种状态,0无害,1有害,2未遍历 ...

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

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

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

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

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

    题目链接 求最大的存活概率,DP+记忆化. 用f[s][x][y][hp]表示在s状态,(x,y)点,血量为hp时的存活概率. s是个三进制数,记录每个陷阱无害/有害/未知. 转移时比较容易,主要是在 ...

  9. 洛谷P2489 [SDOI2011]迷宫探险

    HyperlinkHyperlinkHyperlink https://www.luogu.org/recordnew/lists?uid=52915 评测记录:https://www.luogu.o ...

最新文章

  1. NeHe教程Qt实现——lesson17
  2. Windows 7 + Fedora 17 双系统安装详解
  3. NoneBot2插件——进群欢迎
  4. 从程序猿到SAP产品经理,我是如何转型的?
  5. Openwrt之移动硬盘ext3/ext4格式化工具
  6. 一个很详细的web.xml配置文件详解
  7. bat 文件 服务器,bat文件做成服务器
  8. NYOJ题目171-聪明的kk(dp)
  9. 服务器维修工单模板,XX运维服务方案模板.doc
  10. BZOJ4199: [Noi2015]品酒大会
  11. 更好用计算机怎么打,电脑输入法哪个好用(最受欢迎的7大输入法对比详情)...
  12. 基于Python的深度神经网络的中文期刊分类系统
  13. ❤️UNITY实战进阶-OBB包围盒详解-6
  14. 宾得最小饼干DA 40mm F2.8 Limited[转]_我是亲民_新浪博客
  15. window环境下thrift Compiler 编译步骤
  16. 银河5 号超级计算机,全球超级计算机500强最新排行 天河一号第五
  17. 基于HTML节日主题网页项目的设计与实现——圣诞节日介绍(HTML+CSS)
  18. 2022李宏毅作业hw4 - 挫败感十足的一次作业。
  19. 第二次作业——结对项目之需求分析与原型设计
  20. [附源码]计算机毕业设计JAVA网上学车预约系统

热门文章

  1. 联想笔记本那些有手写功能_联想笔记本那些有手写功能_Windows 8 下笔记本如何实现手写输入...
  2. 计算机原理-操作系统- 转发 微博 Qzone 微信 Linux内核中的数据结构和算法
  3. 微信小程序(文件组成 、目录结构、生命周期方法、AppId、组件(标签)、语法、事件、Api、开发工具)
  4. 你想知道的A/B实验知识全在这里了
  5. SpringBoot 21 Swagger 2.9.2
  6. 全球及中国操纵杆控制系统行业未来前景与投资策略专项咨询报告2021-2027年版
  7. JDBC批量增加批量修改增删改查工具类
  8. 什么时候用 C 而不用 C++?
  9. unity创建一个6面体的3D模型,确保它每一个面都是不同的。能旋转每一个面唤醒不同的物品
  10. 1153 - 三个整数