[学习笔记]高斯消元求解两种特殊问题(带状矩阵/主元法)
本文章是[学习笔记]概率与期望进阶的一部分
由于时间问题我写的比较简略,所以我把大佬的总结链接贴上来了(应该没什么吧qwq)。
1 概述
最常见的当然是随机游走问题了…
• fu=∑pu,v∗(fv+wu,v)f_u=\sum p_{u,v}* (f_{v}+w_{u,v})fu=∑pu,v∗(fv+wu,v)
• 计算期望在这个节点上,停留多少步:fu=∑pv,u∗fv+[u=S]f_u=\sum p_{v,u}* f_v + [u=S]fu=∑pv,u∗fv+[u=S]
然后是两道水题:
HNOI 2013 游走
SDOI 2012 走迷宫
2 Band Matrix
LSK大佬的总结博客
IDnumber4大佬的总结博客
Lucky_Glass大佬的总结博客(好难找…)
cqbzlytina大佬的例题题解
带宽:对于∀(i,j)∈G,ai,j≠0存在一个x,(x,x)∈G且∣i−x∣+∣j−x∣≤d\forall (i,j)\in G,a_{i,j}≠0 存在一个x,(x,x)\in G且|i-x|+|j-x|\leq d∀(i,j)∈G,ai,j=0存在一个x,(x,x)∈G且∣i−x∣+∣j−x∣≤d,当ddd取到最小时就为Band Matrix的带宽。
在做高斯消元时,利用带宽的性质,每次消元只需要处理下ddd行,下ddd列即可。
复杂度就成了O(nd2)O(nd^2)O(nd2)。
注意由于Band Matrix 性质,我们这里就没必要去交换行了。
Berlekamp-Massey算法(并没有什么关系)
CF 963 E Circles of Waiting
蒟蒻的部分实现:
int Gauss(int m,int n){//m行n列int r=1,c=1;for(;r<=m&&c<=n;r++,c++){if(!fun[r][c])return -1;int v=inv(fun[r][c]);for(int i=c;i<=min(c+D,n);i++)fun[r][i]=mul(fun[r][i],v);fun[r][n+1]=mul(fun[r][n+1],v);for(int i=r+1;i<=min(r+D,m);i++)if(fun[i][c]){v=fun[i][c];for(int j=c;j<=min(c+D,n);j++)fun[i][j]=dec(fun[i][j],mul(fun[r][j],v));fun[i][n+1]=dec(fun[i][n+1],mul(fun[r][n+1],v));}}for(int i=r;i<=m;i++)if(fun[i][n+1])return -1;if(c<n)return n-c;for(int i=n;i>=1;i--){int v=fun[i][n+1];for(int j=i+1;j<=min(n,i+D);j++)v=dec(v,mul(ans[j],fun[i][j]));ans[i]=v;}return 0;
}
3 主元法(代入消元法)
ixRic大佬的例题题解
主要用于网格图,我们只需要保留最后一行和最后一列的元素,会发现其他的元素都可以被最后一行最后一列的元素表示出来,这样我们就只需要用最后一行,最后一列的元素来做高斯消元了。
TopCoder 12984 TorusSailing
struct node{DB r[MAXN+5],v;//该点表示的方程
}d[MAXN+5][MAXN+5];DB fun[MAXN+5][MAXN+5],ans[MAXN+5];
DB pabs(DB x){return (x<0)?-x:x;}
int Gauss(int m,int n){//m行n列int col=0,k=0;for(;k<m&&col<n;k++,col++){int r=k;for(int i=k+1;i<m;i++)if(pabs(fun[r][col])<pabs(fun[i][col]))r=i;if(pabs(fun[r][col])<eps){k--;continue;}if(r!=k){for(int i=col;i<=n;i++)swap(fun[k][i],fun[r][i]);}for(int i=k+1;i<m;i++)if(pabs(fun[i][col])>eps){DB Div=fun[i][col]/fun[k][col];for(int j=col;j<=n;j++)fun[i][j]-=fun[k][j]*Div;fun[i][col]=0;}}for(int i=k;i<m;i++)if(pabs(fun[i][n])>eps)return -1;if(k<n)return n-k;for(int i=n-1;i>=0;i--){DB tmp=fun[i][n];for(int j=i+1;j<n;j++)tmp-=ans[j]*fun[i][j];ans[i]=tmp/fun[i][i];}return 0;
}class TorusSailing{public:DB expectedTime(int n,int m,int sx,int sy){for(int i=0;i<n-1;i++)d[i][m-1].r[i]=1;for(int i=0;i<m-1;i++)d[n-1][i].r[i+n-1]=1;for(int i=n-2;i>=0;i--)for(int j=m-2;j>=0;j--){d[i][j].v=0.5*(d[i+1][j].v+d[i][j+1].v)+1;for(int k=0;k<n+m-2;k++)d[i][j].r[k]=0.5*(d[i+1][j].r[k]+d[i][j+1].r[k]);}for(int i=0;i<n-1;i++){fun[i][i]=1,fun[i][n+m-2]=0.5*d[i][0].v+1;for(int k=0;k<n+m-2;k++)fun[i][k]-=0.5*(d[i][0].r[k]+d[i+1][m-1].r[k]);}for(int i=0;i<m-1;i++){int j=i+n-1;fun[j][j]=1,fun[j][n+m-2]=0.5*d[0][i].v+1;for(int k=0;k<n+m-2;k++)fun[j][k]-=0.5*(d[0][i].r[k]+d[n-1][i+1].r[k]);}Gauss(n+m-2,n+m-2);sx=n-1-sx,sy=m-1-sy;DB res=d[sx][sy].v;for(int k=0;k<n+m-2;k++)res+=ans[k]*d[sx][sy].r[k];return res;}
};
[学习笔记]高斯消元求解两种特殊问题(带状矩阵/主元法)相关推荐
- 矩阵树 Matrix-Tree 定理实现模板(高斯消元求解行列式)
大佬1博客:https://www.cnblogs.com/zj75211/p/8039443.html 大佬2博客:https://www.cnblogs.com/yangsongyi/p/1069 ...
- Java学习笔记:创建线程的两种方法
Java学习笔记:创建线程的两种方法 一.预备工作 1.创建Maven项目ThreadDemo 2.在pom.xml里添加依赖 二.继承Thread类创建子线程
- 【Luogu 3389】【模板】高斯消元法(用高斯消元求解线性方程组)
1.线性方程组 2.高斯消元法 步骤1:通过一系列的加减消元,得到类似 kx=b 的式子,求得最后一个未知量的结果 步骤2:然后逐一回代求解整个 x 向量 以下列方程为例: 第一次加减消元,用第1式子 ...
- Spring Boot基础学习笔记03:Spring Boot两种全局配置和两种注解
文章目录 零.学习目标 1.掌握application.properties配置文件 2.掌握application.yaml配置文件 3.掌握使用@ConfigurationProperties注入 ...
- BZOJ:4820: [Sdoi2017]硬币游戏BZOJ:1444: [Jsoi2009]有趣的游戏(高斯消元求概率)
1444: [Jsoi2009]有趣的游戏 4820: [Sdoi2017]硬币游戏 这两道题都是关于不断随机生成字符后求出现给定字符串的概率的问题. 第一题数据范围较小,将串建成AC自动机以后,以A ...
- 解线性方程组——高斯消元の板子
ATP记得它在很久以前看过一点点高斯消元的东西然后做过一点点题目..但是当时实在是太zz了所以本来就没有很懂这个东西现在更是忘得差不多了.. 所以现在就当重新学一遍了QwQ 一点口胡的解释 高斯消元. ...
- BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元
1013: [JSOI2008]球形空间产生器sphere Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/Judg ...
- bzoj 1013: [JSOI2008]球形空间产生器sphere(高斯消元)
1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec Memory Limit: 162 MB Submit: 5598 Solved: 2943 [Su ...
- BZOJ 1013 球形空间产生器(高斯消元)
时间限制: 1 Sec 内存限制: 128 MB 提交: 11 解决: 7 [提交] [状态] [命题人:admin] 题目描述 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被 ...
最新文章
- 泛型java博客园,Java深度历险之Java泛型
- linux下使用expect+scp+shell实现分布式集群系统安装,升级,部署
- mysql创建反弹函数,MySql创建函数
- w3m linux,Linux 终端浏览器 w3m
- 算法专题(1)-信息学基本解题流程!
- 2018年广东年销售额超千亿的企业有哪些?
- HOWTO:将 IOCTL 发送到筛选器驱动程序
- C++ 动态申请数组
- Tomcat 基于域名的虚拟主机设置
- 微服务升级_SpringCloud Alibaba工作笔记0006---spring gateway工作流程
- 小米Android系统限制联网,Android 7 以上版本,绕过CA限制,抓取https
- linux网络调试发包抓包工具
- 计算IO设备、CPU利用率
- 深入WEP密码破解原理
- UE4_模型_Bound(边界)
- 职业选手图解教你如何DIY装机
- go 条件变量简介 sync.Cond
- linux写makefile用tab报错,隐含规则 - linux makefile教程
- 5410 ACM 杭电 01+完全背包
- 学习笔记 | NIPS 2021 regularization cocktail 调优的 MLPs 在表格数据上优于 GBDTs | Regularization is All Your Need
热门文章
- ppt插入的flash有白边的问题
- python抓取国家统计局省市区街道社区数据
- LeetCode 546. 移除盒子 Python
- mahout 推荐算法 java_Mahout之推荐算法基本实例
- tomcat压缩配置
- matlab fir系数,FIR滤波器的系数问题
- 手机S60第三版教程集合
- cad2016中选择全图字体怎么操作_没有下载安装CAD软件怎么打印CAD图纸?快看这里!...
- Android状态机的简单理解
- 注册表html右键默认浏览器,如何锁定默认浏览器?用注册表设置默认浏览器方法...