JC的小苹果 逆矩阵
这题主要有两种做法: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)。
对于矩阵求逆只需将原矩阵高斯消元,然后不管什么操作都对一个单位矩阵做同等变换,单位矩阵在消完元后也就变成了原矩阵的逆矩阵。
#include<bits/stdc++.h>
#define eps 1e-8
using namespace std;
int n,m,hp,a[],tot,to[],fi[],ne[],du[];
double c[][],b[][],d[][],f[][],dp[],ans;
inline void add(int x,int y)
{
ne[++tot]=fi[x];
fi[x]=tot;
to[tot]=y;
}
int main()
{
scanf("%d%d%d",&n,&m,&hp);
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
for(int i=,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(x,y),du[x]++;
if(x!=y)
add(y,x),du[y]++;
}
for(int i=;i<n;i++)
for(int j=fi[i];j;j=ne[j])
{
int y=to[j];
if(!a[y])
{
c[y][i]+=1.0/du[i];
}
}
for(int i=;i<=n;i++)
b[i][i]=,c[i][i]--;
for(int i=;i<=n;i++)
{
int k=i;
for(int j=i+;j<=n;j++)
if(fabs(c[j][i])>fabs(c[k][i]))
k=j;
for(int j=;j<=n;j++)swap(c[i][j],c[k][j]),swap(b[i][j],b[k][j]);
if(fabs(c[i][i])<eps)continue;
double r=c[i][i];
for(int j=;j<=n;j++)
c[i][j]/=r,b[i][j]/=r;
for(int j=;j<=n;j++)
{
if(i==j)continue;
double r=c[j][i];
for(int k=;k<=n;k++)
c[j][k]-=r*c[i][k],b[j][k]-=r*b[i][k];
}
}
f[hp][]=-;
for(int i=hp;i;i--)
{
for(int j=;j<=n;j++)
for(int k=;k<=n;k++)
dp[j]+=f[i][k]*b[j][k];
ans+=dp[n];
for(int j=;j<n;j++)
{
for(int k=fi[j];k;k=ne[k])
{
int y=to[k];
if(a[y]&&i>a[y])
f[i-a[y]][y]-=1.0*dp[j]/du[j];
}
dp[j]=;
}
dp[n]=;
}
printf("%.8lf",ans);
return ;
}
JC的小苹果 逆矩阵的更多相关文章
- BZOJ 3640: JC的小苹果 [概率DP 高斯消元 矩阵求逆]
3640: JC的小苹果 题意:求1到n点权和\(\le k\)的概率 sengxian orz的题解好详细啊 容易想到\(f[i][j]\)表示走到i点权为j的概率 按点权分层,可以DP 但是对于\ ...
- 【BZOJ 3640】JC的小苹果 (高斯消元,概率DP)
JC的小苹果 Submit: 432 Solved: 159 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话 ...
- 【BZOJ3640】JC的小苹果 概率DP+高斯消元
[BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但 ...
- BZOJ 3640: JC的小苹果
3640: JC的小苹果 Time Limit: 15 Sec Memory Limit: 256 MBSubmit: 425 Solved: 155[Submit][Status][Discus ...
- BZOJ 3640 JC的小苹果(逆矩阵)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3640 题意:给出一个无向图,从1走到n.开始是血量H,从u到达v时血量减少a[v] ...
- 3640: JC的小苹果 - BZOJ
让我们继续JC和DZY的故事.“你是我的小丫小苹果,怎么爱你都不嫌多!”“点亮我生命的火,火火火火火!”话说JC历经艰辛来到了城市B,但是由于他的疏忽DZY偷走了他的小苹果!没有小苹果怎么听歌!他发现 ...
- BZOJ3640 : JC的小苹果
设$f[i][j]$表示$hp$为$i$,在$j$点的概率,$d[i]$表示$i$的度数,$w[i]$表示经过$i$点要扣掉的血量. 对于$j$到$k$这条边,$f[i-w[k]][k]+=\frac ...
- 【BZOJ】3640: JC的小苹果
题解 我们考虑列出期望方程组,\(dp[i][j]\)表示在第\(i\)个点血量为\(j\)的时候到达\(N\)点的概率,所有的\(dp[N][j]\)都是1,所有\(j < 0\)都是0 答案 ...
- ●BZOJ 3640 JC的小苹果
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3640题解: 期望dp,高斯消元 设dp[i][h]在i位置且血量为h这个状态的期望经过次数. ...
随机推荐
- CSS 预处理语言之 Scss 篇
简介 1. Sass 和 Scss Sass 和 Scss 其实是同一种东西,我们平时都称之为 Sass:Scss 是 Sass 3 引入新的语法,其语法完全兼容 CSS3,并且继承了 Sass 的强 ...
- 三天讲透SpringBoot-初识基础使用
这次我们来说一下我们的SpringBoot,现在SpringBoot已经成为趋势,在我这里我用三篇文章的形式来讲清楚我们的SpringBoot,大致分为,第一篇讲搭建,基本使用,第二篇三方集成,自动装 ...
- 关于jQery中$.Callbacks()的理解
$.Callbacks()主要使用了回调,而说到回调又不得不说javascript的事件循环机制了. 所以想了解回调最好先看看js运行机制. $.Callbacks()可以理解为创建一个回调队列 va ...
- Paid Roads POJ - 3411
A network of m roads connects N cities (numbered from 1 to N). There may be more than one road conne ...
- sqli-labs靶机注入笔记1-10关
嗯,开始记录sqli-lab的每关笔记,复习一次 1-2关 基于错误的字符串/数字型注入 闭合的符号有区别而已 http://www.sqli-lab.cn/Less-1/?id=1 or 1=1 - ...
- 开启sql语句监控
开启sql执行语句监控 set global general_log=on; set global_log_output='table'; 修改mysql配置文件,在[mysqld]中加入 gener ...
- powerCat进行常规tcp端口转发
实战中,我们也会遇到需要我们进行端口转发的情况,比如已经拿下的目标机1是在dmz区,而目标1所在内网的其他目标只能通过目标1去访问,这时候我们就需要端口转发或者代理来进行后渗透.这次就要介绍一个加强版 ...
- docker1-centos上安装docker
docker镜像(image)相当于面向对象的类 docker容器(container)相当于面向对象的对象 1.安装环境要求 目前,CentOS 仅发行版本中的内核支持 Docker. Docker ...
- 14.Linux压缩/打包
今天来讲解一下压缩和打包的相关命令,首先得先明确两个概念,即:压缩和打包 压缩:将文件或目录进行压强,使文件或目录大小变小 打包:表示将目录中的所有内容,捆绑在一起,方便传输,打包后的文件会变大,不一 ...
- netty源码解析(4.0)-26 ByteBuf内存池:PoolArena-PoolSubpage
PoolChunk用来分配大于或等于一个page的内存,如果需要小于一个page的内存,需要先从PoolChunk中分配一个page,然后再把一个page切割成多个子页-subpage,最后把内存以s ...