1、DP模型

用33进制数表示陷阱的状态,00表示无害,11表示有害,22表示未知。可建立DP模型:
f[x][y][S][h]f[x][y][S][h]表示从(x,y)(x,y)开始,当前陷阱的状态为SS,血量为hh,活着走出迷宫的概率。使用记忆化搜索。

2、边界&转移

边界为:
f[x][y][S][0]=0f[x][y][S][0]=0
当(x,y)(x,y)为终点时f[x][y][S][h]=1f[x][y][S][h]=1
转移为(以下(tx,ty)(tx,ty)为(x,y)(x,y)走一步能到达的格子,且(tx,ty)(tx,ty)不为墙):
当(tx,ty)(tx,ty)为平地,起点,终点或无害陷阱时,
f[x][y][S][h]=max(f[x][y][S][h],f[tx][ty][S][h])f[x][y][S][h]=\max(f[x][y][S][h],f[tx][ty][S][h])
当(tx,ty)(tx,ty)为有害陷阱时,
f[x][y][S][h]=max(f[x][y][S][h],f[tx][ty][S][h−1])f[x][y][S][h]=\max(f[x][y][S][h],f[tx][ty][S][h-1])
当(tx,ty)(tx,ty)为未知陷阱时,设陷阱编号为tttt,则
f[x][y][S][h]=max(f[x][y][S][h],f[tx][ty][S−3tt−1][h−1]∗g[S][tt]+f[x][y][S][h]=\max(f[x][y][S][h],f[tx][ty][S-3^{tt-1}][h-1]*g[S][tt]+
f[tx][ty][S−2∗3tt−1][h]∗(1−g[S][tt]))f[tx][ty][S-2*3^{tt-1}][h]*(1-g[S][tt]))。

3、关于g数组

上面g[S][tt]g[S][tt]表示当前状态为SS时陷阱tttt有害的概率。
预处理gg,也就是枚举SS,再枚举00到2K−12^K-1,选取有用的概率计入gg。

4、总结

结合「SCOI2008奖励关」「JLOI2013卡牌游戏」两题可以得出,像这样有限制条件,且在转移的过程中限制条件不断变化的概率DP,一般模型为:
f[state]f[state]表示从statestate状态到达目标状态的最大/小概率/期望。

5、代码

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
inline int read() {int res = 0; bool bo = 0; char c;while (((c = getchar()) < '0' || c > '9') && c != '-');if (c == '-') bo = 1; else res = c - 48;while ((c = getchar()) >= '0' && c <= '9')res = (res << 3) + (res << 1) + (c - 48);return bo ? ~res + 1 : res;
}
inline char get() {char c; while (((c = getchar()) < 'A' || c > 'E') && c != '@'&& c != '$' && c != '.' && c != '#'); return c;
}
const int N = 35, C = 267, R = 45, V = 10;
int m, n, K, H, dx[] = {1, 0, -1, 0}, dy[] = {0, -1, 0, 1}, pw[V], pb[R];
char s[N][N]; double f[N][N][C][V], gw[C][V];
bool vis[N][N][C][V];
double chkmax(double &a, double b) {a = max(a, b);}
int cyx(int S, int x) {return S / pw[x - 1] % 3;
}
int lpf(int S, int x, int y) {int res = S - cyx(S, x) * pw[x - 1];return res + y * pw[x - 1];
}
void init() {int i, j, S; for (S = 0; S < pw[K]; S++) {int s1 = 0;for (i = 0; i < (1 << K); i++) {bool flag = 1; for (j = 1; j <= K; j++) {int xx = cyx(S, j); if (xx == 2) continue;if (xx != ((i >> j - 1) & 1)) {flag = 0; break;}}if (!flag) continue; s1 += pb[i];for (j = 1; j <= K; j++) {if (cyx(S, j) != 2 || !((i >> j - 1) & 1)) continue;gw[S][j] += pb[i];}}for (i = 1; i <= K; i++) gw[S][i] /= s1;}
}
double DP(int x, int y, int S, int h) {if (vis[x][y][S][h]) return f[x][y][S][h];if (s[x][y] == '@') return vis[x][y][S][h] = 1, f[x][y][S][h] = 1;if (h == 0) return vis[x][y][S][h] = 1, f[x][y][S][h] = 0;vis[x][y][S][h] = 1; int i;for (i = 0; i < 4; i++) {int tx = x + dx[i], ty = y + dy[i], tt = s[tx][ty] - 'A' + 1;if (tx < 1 || tx > m || ty < 1 || ty > n || s[tx][ty] == '#')continue;if (s[tx][ty] == '.' || s[tx][ty] == '@' || s[tx][ty] == '$' ||(tt >= 1 && tt <= K && cyx(S, tt) == 0))chkmax(f[x][y][S][h], DP(tx, ty, S, h));if (tt >= 1 && tt <= K && cyx(S, tt) == 1)chkmax(f[x][y][S][h], DP(tx, ty, S, h - 1));if (tt >= 1 && tt <= K && cyx(S, tt) == 2)chkmax(f[x][y][S][h], DP(tx, ty, lpf(S, tt, 1), h - 1) * gw[S][tt]+ DP(tx, ty, lpf(S, tt, 0), h) * (1.0 - gw[S][tt]));}return f[x][y][S][h];
}
int main() {int i, j, Sx, Sy;m = read(); n = read(); K = read(); H = read();for (i = 1; i <= m; i++) for (j = 1; j <= n; j++)if ((s[i][j] = get()) == '$') Sx = i, Sy = j; pw[0] = 1;for (i = 0; i < (1 << K); i++) pb[i] = read();for (i = 1; i <= K; i++) pw[i] = pw[i - 1] * 3; init();printf("%.3lf\n", DP(Sx, Sy, pw[K] - 1, H));return 0;
}

[BZOJ2246][SDOI2011]迷宫探险(状压概率DP)相关推荐

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

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

  2. bzoj2246: [SDOI2011]迷宫探险

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

  3. HDU 4336 Card Collector(状压 + 概率DP 期望)题解

    题意:每包干脆面可能开出卡或者什么都没有,一共n种卡,每种卡每包爆率pi,问收齐n种卡的期望 思路:期望求解公式为:$E(x) = \sum_{i=1}^{k}pi * xi + (1 - \sum_ ...

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

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

  5. P2473 奖励关 状压概率DP求期望

    题目链接 https://www.luogu.com.cn/problem/P2473 题意 n轮,m种球,每轮随即一个球,可以接可以不接,接的话需要满足这个球的前置条件(比如3号球接球必须已经接过1 ...

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

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

  7. 2021 ccpc 哈尔滨 G. Damaged Bicycle 状压 + 期望dp

    文章目录 题意: 思路: 传送门 题意: 你需要从111走到nnn,初始速度是ttt,某些地方有自行车,每个位置自行车有pip_ipi​的概率是坏掉的,如果自行车没坏可以骑上自行车,速度是rrr,可以 ...

  8. bzoj4565 [HAOI2016]字符合并 结论+状压+区间dp

    如果k==2的话就是记搜, 但这个题用记搜的思路的话是需要枚举k个断点的, 所以对于枚举断点,就很可能有优化,比如到一个断点,一个决策的最优值 于是考虑区间dp模型,相当于是插入一个数,然后看影响. ...

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

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

最新文章

  1. pandas使用groupby函数、agg函数获取每个分组聚合对应的标准差(std)实战:计算分组聚合单数据列的标准差(std)、计算分组聚合多数据列的标准差(std)
  2. j2recover----最强大的jfs2文件恢复工具
  3. DHCP协议格式、DHCP服务搭建、DHCP协商交互过程入门学习
  4. iOS HTTP与 HTTPS
  5. Esfog_UnityShader教程_漫反射DiffuseReflection
  6. weblogic查看内存情况
  7. CSDN:借助工具对【本博客访问来源】进行数据图表可视化(网友主要来自美国、新加坡、日本、英德加澳等)——记录数据来源截止日期20200718晚上22点
  8. 互联网晚报 | 9月7日 星期二 | 徐雷升任京东集团总裁;顺丰宣布再投5亿扶持快递小哥;vivo自研芯片V1正式亮相...
  9. java map 赋值_java Listmap赋值的问题
  10. 登录drupal管理员_管理您的Drupal工作流程的最佳方法
  11. android开发环境的调研
  12. 从C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\mt.exe返回错误
  13. JavaScript学习心得04
  14. 玩转5G之--网络布线2 详细解说
  15. php中503代表什么,php 503是什么错误?_后端开发
  16. iar 预编译会把非条件的去掉_IAR使用最全方法.docx
  17. 自学Vue之路——Vue介绍及基本语法
  18. 电话录音系统服务器 显示断线,申瓯电话录音系统常见问题处理
  19. 东北大学计算机保研每年多少清华,东北大学2020届保研率13%,主要保研本校、天大、国科大、华东、东南大学...
  20. 【游记】BOI2020重现赛

热门文章

  1. html 怎么写出实心园,HTML5绘制实心的文本
  2. ASO搜索优化如何挑选适合的关键词,aso搜索关键词优化
  3. word文档生成PDF文档时候自动生成书签方法
  4. 渐入佳境-2月份英语总结
  5. AAAI‘21 Addressing Class Imbalance in Federated Learning
  6. 【车载助手形象系列二】---车载助手数智人形象制作可以使用AI绘图替代?
  7. Debian 9 安装 NVIDIA显卡驱动
  8. php基于BS模式的物业管理系统设计与实现毕业设计源码290918
  9. 新浪财经博客上的一个隐形链接
  10. 微星h61m主板jsp1接线图_微星主板jspi1怎么接,jspi1怎么接线