zoukankan      html  css  js  c++  java
  • BZOJ3640 : JC的小苹果

    设$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 imes f'[i]=f[i]$,即$f'[i]=G^{-1} imes 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;
    }
    

      

  • 相关阅读:
    Spring boot test
    SQL怎么输出前n个记录? n是中间计算得到的,不支持变量传递
    crontab 命令
    Python 素数判断;以及默尼森数
    精通Web Analytics 2.0 (1) 引言
    Python 编程小备忘
    Python 编辑器 tips
    Hadoop 权威指南学习1 (主要框架)
    ml的线性回归应用(python语言)
    python 学习5--matplotlib画图实践
  • 原文地址:https://www.cnblogs.com/clrs97/p/5095714.html
Copyright © 2011-2022 走看看