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这个状态的期望经过次数. ...
随机推荐
- MySQL 配置环境
MySQL 显示 Can't connect to MySQL server on 'localhost' (10061)怎么解决 在cmd中配置启动sql后,找不到密码.然后怎么也没办法弄,不知道怎 ...
- Linux防火墙常用操作
/tcp —— 配置白名单 sudo systemctl start firewalld — 启动防火墙 sudo firewall-cmd --state - 看状态 sudo firewall-c ...
- 解决Maven依赖jar包冲突总结
maven导入jar包中的一些概念: 直接依赖:项目中直接导入的jar包,就是该项目的直接依赖包. 传递依赖:项目中没有直接导入的jar包,可以通过项目直接依赖jar包传递到项目中 ...
- java高并发----个人学习理解汇总记录
1.首先,需要理解几个概念 1.同步(Synchronous):同步方法调用一旦开始,调用者必须等到前面的方法调用返回后,才能继续后续的行为,依次直到完成所有. 2.异步(Asynchronous): ...
- SpringBoot项目配置Tomcat和JVM参数
设置Tomcat端口号和连接数等 使用application.properties配置文件有一些参数无法设置,所以推荐创建一个类文件来配置,如下: package com.qipai.springbe ...
- MySQL注入--Payload
MySQL注入--Payload Mirror王宇阳 2019-10-22 SQL的注入流程一般如下: 1.判断是否有SQL注入漏洞(判断注入点) 2.判断数据库的系统架构.数据库名.web应用类型等 ...
- java23种设计模式(三)单例模式
原文地址:https://zhuanlan.zhihu.com/p/23713957 一.概述 1.什么是单例模式? 百度百科是这样定义的:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个 ...
- Java基础(十)接口(interface)
1.接口的概念 在Java中,接口不是类,而是对类的一组需求描述,这些类要遵从接口描述. 例如:Array类中的sort方法可以对对象数组进行排序,但要求满足下列前提:对象所属的类必须实现了Compa ...
- GCC中,可以使用未声明过的函数
今天代码中使用了一个函数,这个函数也是自定义的,但是还没来得及声明和定义,可以编译时竟然未报错,网上查了下果然,GCC中可以使用未声明的函数http://bbs.csdn.net/topics/390 ...
- Linux sh脚本用spool导出oracle数据库指定表表数据
脚本如下,已验证可用,可配合crontab使用. 1 #!/bin/bash cd /opt/oracle/datafor_kf #redirect environment variables sou ...