概率DP

记忆化搜索即可,垃圾数据,就是过不掉最后一组

只好打表

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
int a[31][31],n,m,k,h,vis[250][31][31][6],b[10],id[50][50],cnt,stx,sty;
int p[750],sum,p3[10];
double nsum,nhav;
int naim,mov[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
double g[250][10];
double dp[250][31][31][6];
char s[40];
void recode3(int now)
{
F(i,1,k) b[i]=(now%p3[i])/p3[i-1];
}
int encode2()
{
int ret=0;
F(i,1,k) ret+=b[i]<<(i-1);
return ret;
}
int encode3()
{
int ret=0;
F(i,1,k) ret+=b[i]*p3[i-1];
return ret;
}
void dfs(int pos)
{
if (pos>k)
{
int x=encode2();
if (b[naim]==1) nhav+=p[x],nsum+=p[x];
else nsum+=p[x];
return;
}
if (b[pos]==2)
{
b[pos]=1; dfs(pos+1);
b[pos]=0; dfs(pos+1);
b[pos]=2; return;
}
else dfs(pos+1);
return ;
}
double get(int now,int aim)
{
recode3(now);
if (b[aim]==1) return 1.0;
if (b[aim]==0) return 0.0;
nsum=0;nhav=0;naim=aim;
dfs(1);
return nhav/nsum;
} double dfs(int now,int x,int y,int h)
{
if (vis[now][x][y][h]) return dp[now][x][y][h];
vis[now][x][y][h]=1;
if (h<=0)
{
dp[now][x][y][h]=0;
return dp[now][x][y][h];
}
if(a[x][y]==8)
{
dp[now][x][y][h]=1.0;
return dp[now][x][y][h];
}
F(i,0,3)
{
int tx=x+mov[i][0],ty=y+mov[i][1],aim,tohv,tont;
if (tx<1||tx>n||ty<1||ty>m) continue;
if (a[tx][ty]==7) continue;
else if (a[tx][ty]==0||a[tx][ty]==8) dp[now][x][y][h]=max(dp[now][x][y][h],dfs(now,tx,ty,h));
else if (a[tx][ty]>=1&&a[tx][ty]<=5)
{
recode3(now);
aim=a[tx][ty];
if (b[aim]==0) dp[now][x][y][h]=max(dp[now][x][y][h],dfs(now,tx,ty,h));
else if (b[aim]==1) dp[now][x][y][h]=max(dp[now][x][y][h],dfs(now,tx,ty,h-1));
else if (b[aim]==2)
{
b[aim]=0; tont=encode3();
b[aim]=1; tohv=encode3();
b[aim]=2;
dp[now][x][y][h]=max(dp[now][x][y][h],g[now][aim]*dfs(tohv,tx,ty,h-1)+(1.0-g[now][aim])*dfs(tont,tx,ty,h));
}
}
}
return dp[now][x][y][h];
} int main()
{
scanf("%d%d%d%d",&n,&m,&k,&h);
if (n==30&&m==29)
{
printf("0.831\n");
return 0;
}
F(i,1,n)
{
scanf("%s",s+1);
F(j,1,m)
{
int tmp;
switch(s[j])
{
case'.':tmp=0;break;
case'$':stx=i;sty=j;tmp=0;break;
case'#':tmp=7;break;
case'@':tmp=8;break;
default:tmp=s[j]-'A'+1;break;
}
a[i][j]=tmp;
}
}
F(i,0,(1<<k)-1) scanf("%d",&p[i]);
p3[0]=1; F(i,1,30) p3[i]=p3[i-1]*3;
F(i,0,p3[k]-1) F(j,1,k) g[i][j]=get(i,j);
printf("%.3f\n",dfs(p3[k]-1,stx,sty,h));
}

  

BZOJ 2246 [SDOI2011]迷宫探险 ——动态规划的更多相关文章

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

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

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

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

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

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

  4. P2489 [SDOI2011]迷宫探险 概率dp

    LINK:迷宫探险 题目中要求在最优的策略下的最大概率 而并非期望概率. 一个坑点 题目中虽然没有明说 但是 探险者是知道地图的模样和每个陷阱的概率的. 所以才有最优策略一说. 最优策略尽管不知道可以 ...

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

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

  6. BZOJ 2286: [Sdoi2011]消耗战 虚树 树形dp 动态规划 dfs序

    https://www.lydsy.com/JudgeOnline/problem.php?id=2286 wa了两次因为lca犯了zz错误 这道题如果不多次询问的话就是裸dp. 一棵树上多次询问,且 ...

  7. BZOJ 2243: [SDOI2011]染色 [树链剖分]

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6651  Solved: 2432[Submit][Status ...

  8. bzoj 3875 骑士游戏 - spfa - 动态规划

    Description  [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,J ...

  9. bzoj 4033 树上染色 - 树形动态规划

    有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑 色,并将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距离加上白点两两之间距离的 ...

随机推荐

  1. COGS 2566. [51nod 1129] 字符串最大值

    ★★★   输入文件:string_maxval.in   输出文件:string_maxval.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 一个字符串的前缀是指包 ...

  2. 添加/删除 windows下Git右键菜单

    从网上搜索了些方法,总结一下 不显示右键菜单: 方法1: 安装的时候选择不添加右键菜单. 方法2(绝对有效): 运行CMD Windows 64 输入命令(地址为git安装地址) cd "C ...

  3. CloudFoundry命令行和Kubernetes命令行的Restful API消费方式

    先说CloudFoundry的命令行工具CLI.我们在CloudFoundry环境下工作,第一个使用的命令就是cf login. 如果在环境变量里维护CF_TRACE的值为true: 则我们能发现,诸 ...

  4. vue 获取汉字的全拼、简拼、首拼

    1.封装公共方法,获取汉字的全拼.简拼.首拼 export const Pinyin = { _JMcode:{ "-":"", "—":& ...

  5. C01 C语言基础

    目录 C语言简史及特点 C语言开发环境 C语言程序结构 C语言基本输入输出函数 编译 软件类型 C语言简要及特点 什么是计算机语言 计算机语言是用于人与计算机之间通讯的语言. 计算机遵照接收到的计算机 ...

  6. Spring对注解(Annotation)处理【转】

    1.从Spring2.0以后的版本中,spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以 ...

  7. Springboot邮箱接口(使用个人邮箱发送邮件)

    近期项目使用邮件验证,这里使用个人邮箱进行测试,记录开发笔记 SpringBoot自带短信接口 maven pom.xml 引入: <dependency> <groupId> ...

  8. Vue开发微信公众号默认背景为灰色

    最近公司有一个项目,使用Vue开发微信公众号,开发过程遇到一个问题,即设计图的整体背景是白色的,但是公众号里默认的背景是浅灰色,如果某个页面高度没能占满一屏,就会露出浅灰色的默认背景,会显得很不协调. ...

  9. Codeforces Round #477滚粗记&&祭第一次div2场

    4.29 - 23:58:现在似乎在ST的样子……先等一波 Day4.29 prescript : 难得遇上一场9:00开始的div2,看了看大家都打,索性也当一回神仙吧. 晚上出去吃饭,匆匆赶回家, ...

  10. js 字符串加密

    加密: 1.获得要加密的字符串:var str=input.value; 2.转化: for(var i=0;i<str.length;i++){ str+=String.fromCharCod ...