这题主要有两种做法:1种是用逆矩阵,转移时无须高斯消元。2是将常数项回代。这里主要介绍第一种。

首先题里少个条件:点权非负。设f [ i ][ j ]表示hp为i时,到达j点的期望次数。

那么若点权为正,直接转移:f [ i + w[ j ] ][ i ]对f [ i ][ j ]的贡献为f[ i+w[j] ]/d[ i ](d[i]表示点i的出度)

若点权为0,则需高斯消元,单次消元复杂度(n^3)显然会炸,我们考虑优化。、

对于高斯消元,有一个结论:系数矩阵*答案矩阵=常数矩阵(用方程组的定义来理解,挺简单的,虽然我想了好久)

将系数矩阵换到右边,就变成了 答案矩阵=常数矩阵×系数矩阵的逆

对于本题而言,系数矩阵是不变的,变化的只有常数矩阵,而常数矩阵O(m)即可处理出,因此我们可以预处理出系数矩阵的逆矩阵,之后每次只需将逆矩阵与常数矩阵相乘,而常数矩阵为一个列向量,每次乘法复杂度O(n^2),总复杂度O((n^2+m)hp+n^3)。

对于矩阵求逆只需将原矩阵高斯消元,然后不管什么操作都对一个单位矩阵做同等变换,单位矩阵在消完元后也就变成了原矩阵的逆矩阵。

  1. #include<bits/stdc++.h>
  2. #define eps 1e-8
  3. using namespace std;
  4. int n,m,hp,a[],tot,to[],fi[],ne[],du[];
  5. double c[][],b[][],d[][],f[][],dp[],ans;
  6. inline void add(int x,int y)
  7. {
  8. ne[++tot]=fi[x];
  9. fi[x]=tot;
  10. to[tot]=y;
  11. }
  12. int main()
  13. {
  14. scanf("%d%d%d",&n,&m,&hp);
  15. for(int i=;i<=n;i++)
  16. scanf("%d",&a[i]);
  17. for(int i=,x,y;i<=m;i++)
  18. {
  19. scanf("%d%d",&x,&y);
  20. add(x,y),du[x]++;
  21. if(x!=y)
  22. add(y,x),du[y]++;
  23. }
  24. for(int i=;i<n;i++)
  25. for(int j=fi[i];j;j=ne[j])
  26. {
  27. int y=to[j];
  28. if(!a[y])
  29. {
  30. c[y][i]+=1.0/du[i];
  31. }
  32. }
  33. for(int i=;i<=n;i++)
  34. b[i][i]=,c[i][i]--;
  35. for(int i=;i<=n;i++)
  36. {
  37. int k=i;
  38. for(int j=i+;j<=n;j++)
  39. if(fabs(c[j][i])>fabs(c[k][i]))
  40. k=j;
  41. for(int j=;j<=n;j++)swap(c[i][j],c[k][j]),swap(b[i][j],b[k][j]);
  42. if(fabs(c[i][i])<eps)continue;
  43. double r=c[i][i];
  44. for(int j=;j<=n;j++)
  45. c[i][j]/=r,b[i][j]/=r;
  46. for(int j=;j<=n;j++)
  47. {
  48. if(i==j)continue;
  49. double r=c[j][i];
  50. for(int k=;k<=n;k++)
  51. c[j][k]-=r*c[i][k],b[j][k]-=r*b[i][k];
  52. }
  53. }
  54. f[hp][]=-;
  55. for(int i=hp;i;i--)
  56. {
  57. for(int j=;j<=n;j++)
  58. for(int k=;k<=n;k++)
  59. dp[j]+=f[i][k]*b[j][k];
  60. ans+=dp[n];
  61. for(int j=;j<n;j++)
  62. {
  63. for(int k=fi[j];k;k=ne[k])
  64. {
  65. int y=to[k];
  66. if(a[y]&&i>a[y])
  67. f[i-a[y]][y]-=1.0*dp[j]/du[j];
  68. }
  69. dp[j]=;
  70. }
  71. dp[n]=;
  72. }
  73. printf("%.8lf",ans);
  74. return ;
  75. }

JC的小苹果 逆矩阵的更多相关文章

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

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

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

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

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

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

  4. BZOJ 3640: JC的小苹果

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

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

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

  6. 3640: JC的小苹果 - BZOJ

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

  7. BZOJ3640 : JC的小苹果

    设$f[i][j]$表示$hp$为$i$,在$j$点的概率,$d[i]$表示$i$的度数,$w[i]$表示经过$i$点要扣掉的血量. 对于$j$到$k$这条边,$f[i-w[k]][k]+=\frac ...

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

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

  9. ●BZOJ 3640 JC的小苹果

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

随机推荐

  1. MySQL 配置环境

    MySQL 显示 Can't connect to MySQL server on 'localhost' (10061)怎么解决 在cmd中配置启动sql后,找不到密码.然后怎么也没办法弄,不知道怎 ...

  2. Linux防火墙常用操作

    /tcp —— 配置白名单 sudo systemctl start firewalld — 启动防火墙 sudo firewall-cmd --state - 看状态 sudo firewall-c ...

  3. 解决Maven依赖jar包冲突总结

    maven导入jar包中的一些概念:      直接依赖:项目中直接导入的jar包,就是该项目的直接依赖包.      传递依赖:项目中没有直接导入的jar包,可以通过项目直接依赖jar包传递到项目中 ...

  4. java高并发----个人学习理解汇总记录

    1.首先,需要理解几个概念 1.同步(Synchronous):同步方法调用一旦开始,调用者必须等到前面的方法调用返回后,才能继续后续的行为,依次直到完成所有. 2.异步(Asynchronous): ...

  5. SpringBoot项目配置Tomcat和JVM参数

    设置Tomcat端口号和连接数等 使用application.properties配置文件有一些参数无法设置,所以推荐创建一个类文件来配置,如下: package com.qipai.springbe ...

  6. MySQL注入--Payload

    MySQL注入--Payload Mirror王宇阳 2019-10-22 SQL的注入流程一般如下: 1.判断是否有SQL注入漏洞(判断注入点) 2.判断数据库的系统架构.数据库名.web应用类型等 ...

  7. java23种设计模式(三)单例模式

    原文地址:https://zhuanlan.zhihu.com/p/23713957 一.概述 1.什么是单例模式? 百度百科是这样定义的:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个 ...

  8. Java基础(十)接口(interface)

    1.接口的概念 在Java中,接口不是类,而是对类的一组需求描述,这些类要遵从接口描述. 例如:Array类中的sort方法可以对对象数组进行排序,但要求满足下列前提:对象所属的类必须实现了Compa ...

  9. GCC中,可以使用未声明过的函数

    今天代码中使用了一个函数,这个函数也是自定义的,但是还没来得及声明和定义,可以编译时竟然未报错,网上查了下果然,GCC中可以使用未声明的函数http://bbs.csdn.net/topics/390 ...

  10. Linux sh脚本用spool导出oracle数据库指定表表数据

    脚本如下,已验证可用,可配合crontab使用. 1 #!/bin/bash cd /opt/oracle/datafor_kf #redirect environment variables sou ...