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

【BZOJ3640】JC的小苹果

Description

   让我们继续JC和DZY的故事。

    “你是我的小丫小苹果,怎么爱你都不嫌多!”

    “点亮我生命的火,火火火火火!”

    话说JC历经艰辛来到了城市B,但是由于他的疏忽DZY偷走了他的小苹果!没有小苹果怎么听歌!他发现邪恶的DZY把他的小苹果藏在了一个迷宫里。JC在经历了之前的战斗后他还剩下hp点血。开始JC在1号点,他的小苹果在N号点。DZY在一些点里放了怪兽。当JC每次遇到位置在i的怪兽时他会损失Ai点血。当JC的血小于等于0时他就会被自动弹出迷宫并且再也无法进入。

    但是JC迷路了,他每次只能从当前所在点出发等概率的选择一条道路走。所有道路都是双向的,一共有m条,怪兽无法被杀死。现在JC想知道他找到他的小苹果的概率。

    P.S.大家都知道这个系列是提高组模拟赛,所以这是一道送分题balabala

Input

第一行三个整数表示n,m,hp。接下来一行整数,第i个表示jc到第i个点要损失的血量。保证第1个和n个数为0。接下来m行每行两个整数a,b表示ab间有一条无向边。

Output

    仅一行,表示JC找到他的小苹果的期望概率,保留八位小数。

Sample Input

3 3 2
0 1 0
1 2
1 3
2 3

Sample Output

0.87500000

HINT

对于100%的数据 2<=n<=150,hp<=10000,m<=5000,保证图联通。

题解:如果没有Ai=0,直接DP,如果hp很小,直接高斯消元,但是都有,所以用DP+高斯消元。

发现,方程组中只有Ai=0的点有系数,Ai!=0的都可以直接拿过来变成常数项,所以每次我们的方程组只有一列是变化的,所以我们将方程组表示成Ax=b,x=A-1b。x和b都是列向量。所以我们只需要预处理出A的逆,然后每次O(n2)乘一下就行了。

矩阵求逆的方法:先将(A|I)拼一起,然后通过行变换将左边的A消成I,右边剩下的就是A-1

 

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
using namespace std;
int n,m,hp;
int dam[160],pa[5010],pb[5010],d[160];
double f[160][10000],B[160],ans;
struct M
{double v[160][160];M (){memset(v,0,sizeof(v));}double* operator [](int x) {return v[x];}void I(){for(int i=1;i<=n;i++)	for(int j=1;j<=n;j++)	v[i][j]=(i==j)?1:0;}M getinv(){int i,j,k;M re;double t;re.I();for(i=1;i<=n;i++){for(j=i;j<=n;j++)	if(fabs(v[j][i])>fabs(v[i][i]))	for(k=1;k<=n;k++)swap(v[i][k],v[j][k]),swap(re[i][k],re[j][k]);t=v[i][i];for(j=1;j<=n;j++)	v[i][j]/=t,re[i][j]/=t;for(j=1;j<=n;j++)	if(i!=j){t=v[j][i];for(k=1;k<=n;k++)	v[j][k]-=t*v[i][k],re[j][k]-=t*re[i][k];}}return re;}void operator * (int x){for(int i=1;i<=n;i++)	for(int j=1;j<=n;j++)	f[i][x]+=v[i][j]*B[j];}
};
M A,A1;
int rd()
{int ret=0,f=1;	char gc=getchar();while(gc<'0'||gc>'9')	{if(gc=='-')f=-f;	gc=getchar();}while(gc>='0'&&gc<='9')	ret=ret*10+gc-'0',gc=getchar();return ret*f;
}
int main()
{n=rd(),m=rd(),hp=rd();int i,j;for(i=1;i<=n;i++)	dam[i]=rd();for(i=1;i<=m;i++){pa[i]=rd(),pb[i]=rd();d[pa[i]]++;if(pa[i]!=pb[i])	d[pb[i]]++;}for(i=1;i<=m;i++){if(!dam[pb[i]])	A[pb[i]][pa[i]]-=1.0/d[pa[i]];if(pa[i]==pb[i])	continue;if(!dam[pa[i]])	A[pa[i]][pb[i]]-=1.0/d[pb[i]];}for(i=1;i<=n;i++)	A[i][n]=0;for(i=1;i<=n;i++)	A[i][i]++;A1=A.getinv();for(j=hp;j;j--){for(i=1;i<=n;i++)	B[i]=0;if(j==hp)	B[1]=1;else	for(i=1;i<=m;i++){if(dam[pb[i]]&&dam[pb[i]]+j<=hp&&pa[i]!=n)	B[pb[i]]+=f[pa[i]][j+dam[pb[i]]]*1.0/d[pa[i]];if(pa[i]==pb[i])	continue;if(dam[pa[i]]&&dam[pa[i]]+j<=hp&&pb[i]!=n)	B[pa[i]]+=f[pb[i]][j+dam[pa[i]]]*1.0/d[pb[i]];}A1*j,ans+=f[n][j];}printf("%.8lf",ans);return 0;
}

 

转载于:https://www.cnblogs.com/CQzhangyu/p/7054760.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql访问类型最好的_【干货满满】最全的MySQL性能指南(一):选择最佳的数据类型...

对于 MySQL 数据库来说&#xff0c;好的逻辑表和物理表的规划至关重要&#xff0c;我们需要根据查询语句来针对性地设计 Schema &#xff0c;没有万能好用的 Schema。一个 denormalized 的 schema 可以在某些场景下加速语句查询&#xff0c;但是放在其他应用场景下就会适得其反…

测试两个主机之间的连通性_借助网络测试神器极速解决网络故障

时下&#xff0c;网络使用越来越频繁&#xff0c;随之遇到网络故障的情况也多起来&#xff0c;那么诊断网络故障就成了必不可少的一环&#xff0c;投诉和求助是一种基本的方法&#xff0c;但有时太过缓慢&#xff0c;有些时候自己可以快速搞定&#xff0c;检查到故障原因所在&a…

随想,对嵌入式职场建议

guoqingjie已经过去两天了&#xff0c;因为楠哥生病&#xff0c;我们搁浅在了深圳&#xff0c;不过相比在路上的奔波&#xff0c;待在家里感觉惬意不少&#xff0c;不用在路上各种操心&#xff0c;之前上班感冒&#xff0c;身体处在亚健康状态&#xff0c;睡了两天身体也恢复一…

vue.js 四(指令和自定义指令)

官方的指令说明已经很简单了&#xff0c;这里再写一遍&#xff0c;也是自己加深一下印象 v-text 就是写入单纯的文本&#xff0c;可以忽略这个指令直接双花括号代替 <span v-text"msg"></span> <!-- 和下面的一样 --> <span>{{msg}}</spa…

java可达性_java垃圾回收机制--可达性算法

先说一些题外话&#xff0c;Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区&#xff0c;这些区分为线程私有区和线程共享区1、线程私有区a、程序计数器记录正在执行的虚拟机字节码指令地址。此区域是是唯一一个在java虚拟机规范中没有规定任何Ou…

为什么要有uboot?

一、为什么要有uboot1.1、计算机系统的主要部件(1)计算机系统就是以CPU为核心来运行的系统。典型的计算机系统有&#xff1a;PC机&#xff08;台式机笔记本&#xff09;、嵌入式设备&#xff08;手机、平板电脑、游戏机&#xff09;、单片机&#xff08;家用电器像电饭锅、空调…

华为路由器上有没有mac表_MAC地址表、ARP缓存表、路由表及交换机、路由器基本原理...

MAC地址表说到MAC地址表&#xff0c;就不得不说一下交换机的工作原理了&#xff0c;因为交换机是根据MAC地址表转发数据帧的。在交换机中有一张记录着局域网主机MAC地址与交换机接口的对应关系的表&#xff0c;交换机就是根据这张表负责将数据帧传输到指定的主机上的。交换机的…

[luoguP2760] 科技庄园(背包DP)

传送门 每次拿完还得回去。。。 数据中有两个需要注意的地方&#xff1a; 存在桃树上有桃子但是摘 0 次的情况题目中要求体力不能为0&#xff0c;因此就算到达了重点体力也不能为0&#xff0c;所以实际上允许使用的体力为 a - 1把每个桃树想象成物品&#xff0c;体力和时间的最…

#define的高级用法

来源&#xff1a;嵌入式大杂烩地址&#xff1a;https://blog.csdn.net/xiaoxu2050/article/details/82893476一、宏的定义与撤销需要注意的是&#xff1a;&#xff08;1&#xff09;宏定义应注意添加括号&#xff0c;这样语义会比较清晰。&#xff08;2&#xff09;使用#undef可…

python读取csv文件_python3.0读取csv文件

创建CSV文件&#xff0c;可以打开excel文件&#xff0c;创建表格以后&#xff0c;另存为csv文件(以逗号分隔的文件)以文本格式打开&#xff0c;发现是用逗号分隔的用python读取csv文件&#xff0c;首先要引入一个库:csvimport csvdef getCsvFile(strpath):with open(strpath, &…

java 导出excel 例子_java导出Excel例子

//在service层写的&#xff0c;在action直接调用此方法就行了//导出Excelpublic boolean exportExcel(HttpServletResponse response,List list){try{OutputStream os response.getOutputStream();// 取得输出流response.reset();// 清空输出流response.setHeader("Conte…

直击中关村创业大街,新街头霸王来了

中国的硅谷在北京中关村。如今&#xff0c;中关村中正在酝酿硅谷中的硅谷&#xff0c;这里将不断诞生最前卫最现代的互联网和移动互联网创业公司&#xff0c;他们当中极可能孵化出中国互联网企业未来10年的新的BAT。这个硅谷中的硅谷。就是中关村创业大街。这条街在过去15年是北…

我们应该这样理解鸿蒙

之前写过文章谈到的鸿蒙&#xff0c;很多人觉得我说的有点过分&#xff0c;但是我觉得现在出来的情况还是符合预期的&#xff0c;鸿蒙正在完成他的任务。讲个故事&#xff0c;手机还没有普及的时候&#xff0c;相机的地位非常高&#xff0c;相机里面有一个东西叫做胶卷&#xf…

人工智能在语音和数字图像处理领域有哪些具体化应用_智能呼叫中心系统有哪些优势...

近年来&#xff0c;随着科技的发展特别是人工智能技术、云计算、大数据的到来&#xff0c;新技术逐渐渗入人们日常生活中的各行各业里面&#xff0c;以机器人来代替人工处理繁重的任务变得普遍。在人工智能时代下&#xff0c;新一代智能呼叫中心系统应运而生&#xff0c;呼叫中…

java cellvalue_Java Cell.getErrorCellValue方法代码示例

import org.apache.poi.ss.usermodel.Cell; //导入方法依赖的package包/类/*** 获取单元格值** param row 获取的行* param column 获取单元格列号* return 单元格值*/public Object getCellValue(Row row, int column) {Object val "";try {Cell cell row.getCell…

centos下mysql多实例安装3306、3307实例(2014-10-15)

背景说明 mysql的安装方法有多种&#xff0c;如二进制安装、源代码编译安装、yum安装等。yum安装仅仅能安装mysql 5.1 版本号&#xff1b;源代码安装编译的过程比較长。若没有对源代码进行改动且要求使用mysql较高版本号&#xff0c;建议使用二进制安装。本文以二进制安装mysql…

如何自己实现一个栈

文章转自编程珠玑&#xff0c;作者&#xff1a;守望先生前言栈是一种应用广泛的数据结构&#xff0c;例如函数的调用就需要使用栈&#xff0c;其实我们在介绍《栈的操作栈的常见操作有出栈(POP)&#xff0c;从栈中弹出一个元素&#xff1b;入栈(PUSH)&#xff0c;将一个元素压入…

python编写ATM类_Python中编写类的各种技巧和方法

有关 Python 内编写类的各种技巧和方法(构建和初始化、重载操作符、类描述、属性访问控制、自定义序列、反射机制、可调用对象、上下文管理、构建描述符对象、Pickling)。你可以把它当作一个教程&#xff0c;进阶&#xff0c;或者使用参考&#xff1b;我希望它能够成为一份针对…

java的沙盒安全模式_Java沙箱机制

自从 Java 技术出现以来, 有关 Java 平台的安全性及由 Java 技术发展所引发的新的安全性问题,引起了越来越多的关注.目前,Java 已经大量应用在各个领域,研究 Java 的安全 性对于更好地使用 Java 具有深远的意义.本文主要从两个方面阐述了 Java 的安全性:一是 Java 平台(主要通过…

PHP斐波那契数列

今天面试遇到一个斐波那契数列的求法 1 1 2 3 5 8 13 ... 要求写出算法 //数组法 function test($num){$arr[];for($i0;$i<$num;$i){if($i0 || $i1){$arr[$i]1;}else{$arr[$i]$arr[$i-1]$arr[$i-2];}}return $arr[$num]; } print_r(test(10));//递归法 function fib_recursi…