【BZOJ 4832】 [Lydsy2017年4月月赛] 抵制克苏恩 期望概率dp
2024-10-20 09:37:00
打记录的题打多了,忘了用开维记录信息了......我们用f[i][j][l][k]表示已经完成了i次攻击,随从3血剩j个,2血剩l个,1血剩k个,这样我们求出每个状态的概率,从而求出他们对答案的贡献并加和,一开始我用的期望忘了转移的时候不能用1而要用概率......
#include <cstdio>
#include <cstring>
#define r register
using namespace std;
typedef long double LD;
inline int read()
{
r int sum=;
r char ch=getchar();
while(ch<''||ch>'')ch=getchar();
while(ch>=''&&ch<='')
{
sum=(sum<<)+(sum<<)+ch-'';
ch=getchar();
}
return sum;
}
LD f[][][][];
int main()
{
r int T=read();
while(T--)
{
for(r int i=;i<;++i)
for(r int j=;j<;++j)
for(r int l=;l<;++l)
for(r int k=;k<;++k)
f[i][j][l][k]=0.0;
r int K=read(),A=read(),B=read(),C=read();
f[][C][B][A]=1.0;
LD ans=0.0;
for(r int i=;i<K;++i)
for(r int j=;j<=;++j)
for(r int l=;l+j<=;++l)
for(r int k=;k+j+l<=;++k)
{
f[i+][j][l][k]+=f[i][j][l][k]/(+j+l+k);
ans+=f[i][j][l][k]/(+j+l+k);
if(k)
f[i+][j][l][k-]+=f[i][j][l][k]*k/(+j+l+k);
if(j+l+k<)
{
if(l)
f[i+][j+][l-][k+]+=f[i][j][l][k]*l/(+j+l+k);
if(j)
f[i+][j][l+][k]+=f[i][j][l][k]*j/(+j+l+k);
}
else
{
if(l)
f[i+][j][l-][k+]+=f[i][j][l][k]*l/(+j+l+k);
if(j)
f[i+][j-][l+][k]+=f[i][j][l][k]*j/(+j+l+k);
}
}
double Ans=ans;
printf("%.2lf\n",Ans);
}
}
最新文章
- JavaEE:JavaEE技术组成
- 大熊君学习html5系列之------requestAnimationFrame(实现动画的另一种方案)
- hammer.js手势库使用
- UIView UIwindow
- oracle通过plsql导入dmp数据文件
- FreeMarker页面中获得contextPath
- Android SDK无法更新解决方法
- Zabbix探索:Agent配置中Hostname错误引起的Agent.Ping报错
- linux安装JDK TOMCAT
- [ios2] CABasicAnimation【转】
- angularjs中的下拉框默认选中
- HTTP协议07-通用首部字段
- bzoj 4816
- python中安装request模块
- spring 注解@PathVariable
- Linux基础和网络管理上机试题 - imsoft.cnblogs
- 关于php优化 你必须知道的一些事情
- python2.7 关于打印中文的各种方法
- Redis-Map
- adroid swipeRefreshLayout无法显示进度条的问题