Description

题目链接

Solution

用三进制表示陷阱状态,1表示有害,2表示无害,0表示不知道

用\(f[S][i]\)表示状态为S时陷阱i有害的概率,这个可以预处理出

\(d[S][i][j][h]\)表示状态为S,在坐标\((i,j)\),血量为h时的答案

然后就可以DP了,记忆化搜索

Code

#include <cstdio>
#include <algorithm>
#define db double
#define Sta 300
#define N 36
using namespace std; const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};
db dp[Sta][N][N][6],f[Sta][N];
int n,m,k,h,p[N],sx,sy,A[6];
char g[N][N]; inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
} db tmp[2];
void dfs(int x){
if(x==k){
int S=0;
for(int i=k-1;i>=0;--i) S=S*3+A[i];
for(int i=0;i<k;++i){
if(A[i]!=2) continue;
tmp[0]=tmp[1]=0;
for(int j=0;j<(1<<k);++j){
bool flag=0;
for(int l=0;l<k;++l)
if(A[l]==2) continue;
else if(A[l]!=((j>>l)&1)){flag=1;break;}
if(flag) continue;
tmp[(j>>i)&1]+=p[j];
}
f[S][i]=tmp[1]/(tmp[1]+tmp[0]);
}
}else for(int i=0;i<=2;++i){A[x]=i;dfs(x+1);}
} int Change(int S,int pos,int x){
for(int i=0;i<pos;++i) A[i]=S%3,S/=3;S-=x;
for(int i=pos-1;i>=0;--i) S=S*3+A[i];
return S;
} db DP(int S,int x,int y,int h){
if(!h) return 0;
if(g[x][y]=='@') return 1;
db &tmp=dp[S][x][y][h];
if(tmp!=-1) return tmp;
tmp=0; for(int d=0;d<4;++d){
int nx=x+dx[d],ny=y+dy[d],tS=S;
if(nx<=0||ny<=0||nx>n||ny>m) continue;
char ch=g[nx][ny];
if(ch=='#') continue;
else if(ch=='.'||ch=='$'||ch=='@') tmp=max(tmp,DP(S,nx,ny,h));
else if(ch>='A'&&ch<='Z'){
int id=ch-'A';
for(int i=0;i<id;++i) tS/=3;
if(tS%3==2) tmp=max(tmp,DP(Change(S,id,2),nx,ny,h)*(1-f[S][id])+DP(Change(S,id,1),nx,ny,h-1)*f[S][id]);
else tmp=max(tmp,DP(S,nx,ny,h-(tS%3)));
}
}
return tmp;
} int main(){
n=read(),m=read(),k=read(),h=read();
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]=='$'){sx=i;sy=j;break;}
int tot=1;for(int i=1;i<=k;++i)tot*=3;--tot;
dfs(0);
for(int i=0;i<Sta;++i)for(int j=1;j<N;++j)for(int k=1;k<N;++k)for(int l=0;l<6;++l)dp[i][j][k][l]=-1;
printf("%.3lf\n",DP(tot,sx,sy,h));
return 0;
}

最新文章

  1. Configure a bridge interface over a VLAN tagged bonded interface
  2. 【leetcode】plus One
  3. linux下的crontab服务
  4. xml问题报错处理
  5. FCK编辑器漏洞总结
  6. python_way,day3 集合、函数、三元运算、lambda、python的内置函数、字符转换、文件处理
  7. sphinx 占用大量内存
  8. Assembly &#39;Microsoft.Office.Interop.Excel
  9. 用DIV+Css+Jquery 实现的旧版微信飞机大战。
  10. RPC服务不可用总结
  11. 菜鸟谈谈C#中的构造函数和析构函数
  12. How to SHA1 on macOS
  13. HttpClient和HttpURLConnection的使用和区别
  14. 清空nohup日志
  15. 编程实现类似Linux下cp功能
  16. grep搜索文本
  17. 【洛谷p1507】NASA的食物计划
  18. 基于tkinter的九型人格测试系统介绍
  19. Daily Scrumming* 2015.12.17(Day 9)
  20. GC之八--GC 触发Full GC执行的情况及应对策略

热门文章

  1. Android 编码风格规范,很赞哦
  2. 算法练习-Palindrome Number
  3. SharePoint 2010 VS.net 2010 断点调试
  4. System Center Configuration Manager 2016 配置安装篇(Part1)
  5. Office加载项安装
  6. IDEA 打包jar
  7. input-file类型accept 属性对性能的影响
  8. centos 7(1611)安装笔记
  9. May 8th 2017 Week 19th Monday
  10. 20145238-荆玉茗 《Java程序设计》第一周学习总结