标签:http 事件 include des str 正数 print bsp content
Time Limit: 1 Sec Memory Limit: 128 MB
对于每局游戏,输出一个数字表示总伤害的期望值,保留两位小数。
1 1 1 1 1
1 1 1 1 1
玩阴阳师的非洲人默默仰望炉石势力。
因为期望dp都是逆推,一般还会套记搜。所以我就正着推了……(我期望dp弱啊)
定义状态f[t][i][j][k]表示克苏恩攻击第t次,还剩i只1滴血的奴隶主,j只2滴血的奴隶主,k只三滴血奴隶主的概率(注意是,概率)。
因为期望等于所有事件概率 * 数值 之和,
当克苏恩攻击人时 ans += f[t - 1][j][k][l] / (1 + j + k + l);
转移状态
f[t][j][k][l] += f[t - 1][j][k][l] / (1 + j + k + l);
if(j)f[t][j - 1][k][l] += f[t - 1][j][k][l] * j / (1 + j + k + l);
if(k)f[t][j + 1][k - 1][l + flag] += f[t - 1][j][k][l] * k / (1 + j + k + l);
if(l)f[t][j][k + 1][l - 1 + flag] += f[t - 1][j][k][l] * l / (1 + j + k + l);
你问我为啥没考虑30滴血被打完的情况?因为有草爹沉迷输出,见死不救啊。(咳咳)
好嘛,其实正确按题意应该会再加一维去考虑剩的血量问题,因为题上数据没考虑这个,就不用考虑了。
# include <iostream> # include <cstdio> # include <cstring> using namespace std; int T,K,A,B,C; double f[52][8][8][8],ans; int main(){ scanf("%d",&T); scanf("\n%1c %1c",&a,&b) while(T--){ ; scanf("%d %d %d %d",&K,&A,&B,&C); memset(f,0,sizeof f); f[0][A][B][C] = 1; ans = 0; for(int t = 1;t <= K;t++) for(int j = 0;j <= 7;j++){ for(int k = 0;k <= 7;k++){ if(k + j > 7)break; for(int l = 0;l <= 7;l++){ if(l + k + j > 7)break; int flag = ((l + k + j) < 7) ? 1 : 0; f[t][j][k][l] += f[t - 1][j][k][l] / (1 + j + k + l); ans += (f[t - 1][j][k][l] / (1 + j + k + l)); if(j)f[t][j - 1][k][l] += f[t - 1][j][k][l] * j / (1 + j + k + l); if(k)f[t][j + 1][k - 1][l + flag] += f[t - 1][j][k][l] * k / (1 + j + k + l); if(l)f[t][j][k + 1][l - 1 + flag] += f[t - 1][j][k][l] * l / (1 + j + k + l); } } } printf("%.2lf",ans); } }
[Bzoj4832][Lydsy2017年4月月赛]抵制克苏恩 (期望dp)
标签:http 事件 include des str 正数 print bsp content
原文地址:http://www.cnblogs.com/lzdhydzzh/p/7694779.html