设$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. iOS UILabel圆角

    对于UIView 直接设置 uiview.layer.cornerRadius = 5 就可以有圆角了 但是对于UILabel则不然, 要多设置一个uilabel.clipsToBounds = YE ...

  2. Matlab实现线性回归和逻辑回归: Linear Regression & Logistic Regression

    原文:http://blog.csdn.net/abcjennifer/article/details/7732417 本文为Maching Learning 栏目补充内容,为上几章中所提到单参数线性 ...

  3. myeclipse2014安装反编译插件

    一.在线安装方式: Eclipse Class Decompiler整合了目前最好的2个Java反编译工具Jad和JD-Core,并且和Eclipse Class Viewer无缝集成,能够很方便的使 ...

  4. 15 day 1代碼

    第一题 用堆维护. #include <cstdio> #include <algorithm> #include <queue> int n,i,f[400000 ...

  5. 静态资源[org.springframework.web.servlet.PageNotFound]

    springmvc 无法访问js.css.jpg等资源文件,tomcat启动报警告如下 [org.springframework.web.servlet.PageNotFound] - No mapp ...

  6. cookie注入的形成,原理,利用总结

    一:cookie注入的形成 程序对提交数据获取方式是直接request("c.s.t")的方式.未指明使用request对象的具体方法进行获取. 二:原理 request(&quo ...

  7. velocity的string转数字,numberTool

    velocity的string转数字,非常有意思: 1.通过java的包装类进行转换 #set($intString = "20") #set($Integer = 0) $Int ...

  8. Android 中的code sign

    Android 中和ios中都有code sign.它们的目的一样,都是要保证程序的可靠性,最基本实现原理也一样.但是sign的过程比较不同. 下面记录一点Android sign的重要知识. 请参看 ...

  9. Java中必须了解的常用类

    1.Java的包装类 基本数据类型我们都很熟悉,例如:int.float.double.boolean.char等,基本数据类型不具备对象的特征,不能调用方法,一般能实现的功能比较简单,为了让基本数据 ...

  10. Shallow Size 和 Retained Size

    所有包含Heap Profling功能的工具(MAT, Yourkit, JProfiler, TPTP等)都会使用到两个名词,一个是Shallow Size,另一个是 Retained Size. ...