3640: JC的小苹果

题意:求1到n点权和\(\le k\)的概率


sengxian orz的题解好详细啊

容易想到\(f[i][j]\)表示走到i点权为j的概率

按点权分层,可以DP

但是对于\(val[i]=0\)的点,就不是DAG了,必须使用高斯消元

每层消元一次?复杂度\(O(SN^3)\),boom!!!

发现每次的系数矩阵一样

\[Ax=b \rightarrow x=A^{-1}b
\]

我们求出\(A\)矩阵的逆,然后直接让常数向量乘逆就可以了,因为常数矩阵是向量,一次的复杂度\(O(N^2)\)

然后就可以\(O(SN^2)\)了

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef unsigned long long ll;
const int N=155, M=1e4+5;
const double eps=1e-8;
inline int read() {
char c=getchar(); int x=0, f=1;
while(c<'0' || c>'9') {if(c=='-')f=-1; c=getchar();}
while(c>='0' && c<='9') {x=x*10+c-'0'; c=getchar();}
return x*f;
} int n, m, s, val[N], u, v;
struct edge{int v, ne;}e[M];
int cnt=1, h[N], de[N];
inline void ins(int u, int v) { e[++cnt]=(edge){v, h[u]}; h[u]=cnt; }
struct Matrix {
double a[N][N];
Matrix() {memset(a, 0, sizeof(a));}
double* operator [](int x) {return a[x];}
void im() {for(int i=1; i<=n; i++) a[i][i]=1;}
void print() {for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) printf("%lf%c",a[i][j], j==n?'\n':' ');puts("");}
}a, c;
Matrix inverse(Matrix a) {
Matrix c; c.im();
for(int i=1; i<=n; i++) {
int r=i;
for(int j=i; j<=n; j++) if(abs(a[j][i])>abs(a[r][i])) r=j;
if(r!=i) for(int j=1; j<=n; j++) swap(a[i][j], a[r][j]), swap(c[i][j], c[r][j]); double t = a[i][i];
for(int j=1; j<=n; j++) a[i][j]/=t, c[i][j]/=t; for(int k=1; k<=n; k++) if(k!=i) {
double t = a[k][i];
for(int j=1; j<=n; j++) a[k][j] -= t*a[i][j], c[k][j] -= t*c[i][j];
}
}
return c;
} double b[N], f[N][M];
void dp() {
double ans=0;
for(int now=s; now>0; now--){
memset(b, 0, sizeof(b));
if(now==s) b[1]=1;
for(int u=1; u<=n; u++) if(val[u] && now+val[u]<=s)
for(int i=h[u];i;i=e[i].ne) if(e[i].v != n)
b[u] += f[e[i].v][now+val[u]] / de[e[i].v]; for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++) f[i][now] += a[i][j] * b[j]; ans += f[n][now];
}
printf("%.8lf", ans);
}
int main() {
freopen("in","r",stdin);
n=read(); m=read(); s=read();
for(int i=1; i<=n; i++) val[i]=read();
for(int i=1; i<=m; i++) {
u=read(); v=read();
ins(u, v); de[u]++;
if(u!=v) ins(v, u), de[v]++;
}
for(int u=1; u<=n; u++) {
a[u][u]=1;
if(!val[u]) for(int i=h[u];i;i=e[i].ne) if(e[i].v != n) a[u][e[i].v] -= 1.0/de[e[i].v];
}
a = inverse(a);
dp();
}

BZOJ 3640: JC的小苹果 [概率DP 高斯消元 矩阵求逆]的更多相关文章

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

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

  2. BZOJ 3143: [Hnoi2013]游走 [概率DP 高斯消元]

    一个无向连通图,顶点从1编号到N,边从1编号到M. 小Z在该图上进行随机游走,初始时小Z在1号顶点,每一步小Z以相等的概率随机选 择当前顶点的某条边,沿着这条边走到下一个顶点,获得等于这条边的编号的分 ...

  3. BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元

    BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...

  4. LightOJ - 1151概率dp+高斯消元

    概率dp+高斯消元 https://vjudge.net/problem/LightOJ-1151 题意:刚开始在1,要走到100,每次走的距离1-6,超过100重来,有一些点可能有传送点,可以传送到 ...

  5. 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

    题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...

  6. BZOJ3270 博物館 概率DP 高斯消元

    BZOJ3270 博物館 概率DP 高斯消元 @(XSY)[概率DP, 高斯消元] Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博 ...

  7. BZOJ 3270: 博物馆 [概率DP 高斯消元]

    http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...

  8. 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径

    2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 682  Solved: 384[Submit][Stat ...

  9. BZOJ 3270 博物馆 ——概率DP 高斯消元

    用$F(i,j)$表示A在i,B在j的概率. 然后很容易列出转移方程. 然后可以高斯消元了! 被一个问题困扰了很久,为什么起始点的概率要加上1. (因为其他博客上都是直接写成-1,雾) 考虑初始状态是 ...

随机推荐

  1. android小说阅读源码、bilibili源码、MVP新闻源码等

    Android精选源码 一款基于 MVP+RxJava2+Retrofit2 的应用--熊猫眼 android 五子棋源码分享 android实现全国地图点击效果 android实现立体图案绘制的代码 ...

  2. bean的作用域 :singleton和prototype

  3. UEP-级联查询

    级联查询在UEP中采用动态下拉的形式,cascadeid为关键字,注意jsp页面的id的相互嵌套关系,数据库字段的数值的设置,和动态下拉SQL语句的书写.本功能实现了省市区的三级联动查询

  4. [国嵌攻略][048][MMU配置与使用]

    MMU配置与使用 1.通过点亮LED使用虚拟地址来使用MMU,采用段页映射方式 2.任务步骤:1.建立一级页表 2.写入TTB 3.打开MMU 代码编写 1.虚拟地址的段地址0xA0000000,一级 ...

  5. 把自己的js模块兼容到AMD CMD CommonJS

    为了让同一个模块可以运行在前后端,在写作过程中需要考虑兼容前端也实现了模块规范的环境.为了保持前后端的一致性,类库开发者需要将类库代码包装在一个闭包内.以下代码演示如何将hello()方法定义到不同的 ...

  6. Angular(2+) 国际化方案(ngx-translate)

    本文只针对ngx-translate/core 6.x版本,如果你使用的是5.x或者更低的版本,请参照以下链接. https://github.com/ngx-translate/core/blob/ ...

  7. windows下安装redis3.2.100单机和集群详解

    下载redis 下载地址:https://github.com/MicrosoftArchive/redis/releases 我下载的是3.2.100版本的Redis-x64-3.2.100.zip ...

  8. Tomcat下的Server.xml配置文件详解

    自15年毕业到现在已经入行两年多了,一直以来没有深入的了解过tomcat的详细配置,只懂修改一下端口号.在网上找了些相关资料来支撑这篇文章,深入了解server.xml文件各配置的作用 <?xm ...

  9. Java 获得Class的绝对路径方法

    Java获得class文件的绝对路径:1.e.g. Foo.class => Foo.class.getResuorce("").getFile(); 该方法在eclipse ...

  10. xml格式字符串转为Map

    import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom ...