设$f[i][j]$表示$hp$为$i$,在$j$点的概率,$d[i]$表示$i$的度数,$w[i]$表示经过$i$点要扣掉的血量。

对于$j$到$k$这条边,$f[i-w[k]][k]+=\frac{f[i][j]}{d[j]}$。

若$w[k]>0$,则直接将贡献加给$f[i-w[k]][k]$,否则加入转移矩阵$G$。

对于当前层,有$G\times f'[i]=f[i]$,即$f'[i]=G^{-1}\times f[i]$,对$G$求出逆矩阵即可。

时间复杂度$O(n^3+n^2hp)$。

#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=152,M=10010;
int n,m,hp,i,j,k,w[N],g[N],v[M],nxt[M],ed;
double t,a[N][N],b[N][N],d[N],f[M][N],c[N],ans;
void add(int x,int y){d[x]+=1;v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
int main(){
scanf("%d%d%d",&n,&m,&hp);
for(i=1;i<=n;i++)scanf("%d",&w[i]);
while(m--){
scanf("%d%d",&i,&j),add(i,j);
if(i!=j)add(j,i);
}
for(i=1;i<=n;i++)d[i]=1.0/d[i];
for(i=1;i<=n;i++){
if(i<n)for(j=g[i];j;j=nxt[j])if(!w[v[j]])a[v[j]][i]-=d[i];
a[i][i]+=1,b[i][i]=1;
}
for(i=1;i<=n;i++){
for(k=i,j=i+1;j<=n;j++)if(fabs(a[j][i])>fabs(a[k][i]))k=j;
if(k!=i)for(j=1;j<=n;j++)swap(a[i][j],a[k][j]),swap(b[i][j],b[k][j]);
for(j=i+1;j<=n;j++)for(t=a[j][i]/a[i][i],k=1;k<=n;k++)a[j][k]-=a[i][k]*t,b[j][k]-=b[i][k]*t;
}
for(i=n;i;i--){
for(j=n;j>i;j--)for(t=a[i][j],k=1;k<=n;k++)a[i][k]-=a[j][k]*t,b[i][k]-=b[j][k]*t;
for(t=a[i][i],j=1;j<=n;j++)a[i][j]/=t,b[i][j]/=t;
}
f[hp][1]=1;
for(i=hp;i;i--){
for(j=1;j<=n;j++)for(c[j]=0,k=1;k<=n;k++)c[j]+=b[j][k]*f[i][k];
ans+=c[n],c[n]=0;
for(j=1;j<n;j++)for(k=g[j];k;k=nxt[k])if(w[v[k]]&&i>w[v[k]])f[i-w[v[k]]][v[k]]+=c[j]*d[j];
}
return printf("%.8f",ans),0;
}

  

BZOJ3640 : JC的小苹果的更多相关文章

  1. bzoj千题计划291:bzoj3640: JC的小苹果

    http://www.lydsy.com/JudgeOnline/problem.php?id=3640 dp[i][j] 表示i滴血到达j的概率 dp[i][j] = Σ dp[i+val[i]][ ...

  2. 【BZOJ3640】JC的小苹果 概率DP+高斯消元

    [BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但 ...

  3. BZOJ 3640: JC的小苹果 [概率DP 高斯消元 矩阵求逆]

    3640: JC的小苹果 题意:求1到n点权和\(\le k\)的概率 sengxian orz的题解好详细啊 容易想到\(f[i][j]\)表示走到i点权为j的概率 按点权分层,可以DP 但是对于\ ...

  4. 【BZOJ 3640】JC的小苹果 (高斯消元,概率DP)

    JC的小苹果 Submit: 432  Solved: 159 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话 ...

  5. BZOJ 3640: JC的小苹果

    3640: JC的小苹果 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 425  Solved: 155[Submit][Status][Discus ...

  6. 3640: JC的小苹果 - BZOJ

    让我们继续JC和DZY的故事.“你是我的小丫小苹果,怎么爱你都不嫌多!”“点亮我生命的火,火火火火火!”话说JC历经艰辛来到了城市B,但是由于他的疏忽DZY偷走了他的小苹果!没有小苹果怎么听歌!他发现 ...

  7. ●BZOJ 3640 JC的小苹果

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3640题解: 期望dp,高斯消元 设dp[i][h]在i位置且血量为h这个状态的期望经过次数. ...

  8. BZOJ 3640 JC的小苹果(逆矩阵)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3640 题意:给出一个无向图,从1走到n.开始是血量H,从u到达v时血量减少a[v] ...

  9. 【BZOJ】3640: JC的小苹果

    题解 我们考虑列出期望方程组,\(dp[i][j]\)表示在第\(i\)个点血量为\(j\)的时候到达\(N\)点的概率,所有的\(dp[N][j]\)都是1,所有\(j < 0\)都是0 答案 ...

随机推荐

  1. django-cms 代码研究(三)插件(plugs in)

    插件(plugs in) djangocms支持的插件有: http://docs.django-cms.org/en/latest/basic_reference/plugin_reference. ...

  2. 【Spring】Spring系列1之Spring概述

    概述

  3. lambda 表达式

    C++0x 的语法还是比较简单.下面通过几个例子来介绍下. 先是通过 std::for_each 演示一个简单的例子: ? std::for_each 和 lambda 1 2 3 4 5 6 7 8 ...

  4. 如何分割一个utf8字符串(保证单个汉字的完整性)

    std::list<std::string> split_utf8_string(const std::string& text) { std::list<std::stri ...

  5. jQuery结合Ajax实现简单的前端验证和服务端查询

    上篇文章写了简单的前端验证由传统的JavaScript转向流畅的jQuery滑动验证,现在拓展一下,使用Ajax实现用户体验比较好的异步查询,同样还是从建立一个简单的表单开始 <form nam ...

  6. 低配置电脑播放 flash 视频时 占 cpu 资源过高的解决方法

    安装低版本的 flash player 版本, 经调试能满足播放的最低版本是 Flash Player 10.3.183.90 然后 firefox 3.6.28 + Adblock Plus 2.0 ...

  7. js如何往数组Array中添加元素

    转载自:http://blog.sina.com.cn/s/blog_95fa28e60101mwup.html unshift:将参数添加到原数组开头,并返回数组的长度  pop:删除原数组最后一项 ...

  8. CodeForces - 417B (思维题)

    Crash Time Limit: 1000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Status ...

  9. Java虚拟机支持的最大内存限制

    最近在开发Java的程序.本来我是一直很喜欢Java的内存管理的,不需要担心分配内存,只管分配,垃圾收集器自己会给你回收内存的.现在开发的程序数据量很大,为了速度快,我准备把所有的信息加载进内存,这样 ...

  10. 第一套增删改查(htm+ashx完成)

    1.展示人员列表htm文件: <a href="PersonEditAddNew.ashx?action=addnew">添加</a> </p> ...