让我们继续JC和DZY的故事。
“你是我的小丫小苹果,怎么爱你都不嫌多!”
“点亮我生命的火,火火火火火!”
话说JC历经艰辛来到了城市B,但是由于他的疏忽DZY偷走了他的小苹果!没有小苹果怎么听歌!他发现邪恶的DZY把他的小苹果藏在了一个迷宫里。JC在经历了之前的战斗后他还剩下hp点血。开始JC在1号点,他的小苹果在N号点。DZY在一些点里放了怪兽。当JC每次遇到位置在i的怪兽时他会损失Ai点血。当JC的血小于等于0时他就会被自动弹出迷宫并且再也无法进入。
但是JC迷路了,他每次只能从当前所在点出发等概率的选择一条道路走。所有道路都是双向的,一共有m条,怪兽无法被杀死。现在JC想知道他找到他的小苹果的概率。

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

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

样例输入:
3 3 2 0 1 0 1 2 1 3 2 3

样例输出:
0.87500000

数据范围:
对于10%的数据n=5,hp=1
对于30%的数据n<=20,hp<=5
对于60%的数据n<=50,hp<=10000
对于另外10%的数据 所有点权均为正
对于100%的数据 2<=n<=150,hp<=10000,m<=5000,保证图联通,点权非负。

时间限制:
4s

空间限制:
256M

囧,一开始不知道点权非负,是后来加上去的,问别人才知道

copy题解(懒得写了,题解讲得比我好多了):

【算法一】
爆搜(虽然我也不知道怎么搜) 期望的分10
【算法二】
把所有点按照hp拆点,然后高斯消元,复杂度O(hp^3*n^3)。期望的分30
【算法三】
我们发现对于hp来说层与层之间是DAG,所以每一层做高斯消元。然后层与层之间递推就可以了。复杂度O(hp*n^3),期望的分60
【算法四】
大致同算法三,但是我们发现每一次高斯消元的矩阵除了常数项都是相同的,所以可以先进行一次高斯消元预处理,其它只要做带入的工作即可。复杂度O(hp*n^2),期望的分100

囧,自环环太无语,只能加一条,不能加两次

 const
maxn=;
maxm=;
maxhp=;
eps=1e-9;
var
x,y:array[..maxn,..maxn]of double;
f:array[..maxhp,..maxn]of double;
ff:array[..maxn]of double;
a,d,first:array[..maxn]of longint;
last,next:array[..maxm*]of longint;
n,m,hp,tot:longint;
ans:double; procedure insert(x,y:longint);
begin
if x=n then exit;
inc(tot);
last[tot]:=y;
next[tot]:=first[x];
first[x]:=tot;
inc(d[x]);
end; procedure swap(var x,y:double);
var
t:double;
begin
t:=x;x:=y;y:=t;
end; procedure work;
var
i,j,k:longint;
s:double;
begin
for i:= to n do
begin
j:=first[i];
while j<> do
begin
if a[last[j]]= then x[last[j],i]:=x[last[j],i]-/d[i];
j:=next[j];
end;
end;
for i:= to n do x[i,i]:=x[i,i]+;
for i:= to n do y[i,i]:=;
for i:= to n- do
begin
for j:=i to n do
if abs(x[j,i])>eps then break;
for k:= to n do swap(x[i,k],x[j,k]);
for k:= to n do swap(y[i,k],y[j,k]);
for j:=i+ to n do
if abs(x[j,i])>eps then
begin
s:=x[j,i]/x[i,i];
for k:= to n do x[j,k]:=x[j,k]-x[i,k]*s;
for k:= to n do y[j,k]:=y[j,k]-y[i,k]*s;
end;
end;
for i:=n downto do
for j:= to i- do
if abs(x[j,i])>eps then
begin
s:=x[j,i]/x[i,i];
for k:= to n do x[j,k]:=x[j,k]-x[i,k]*s;
for k:= to n do y[j,k]:=y[j,k]-y[i,k]*s;
end;
for i:= to n do
for j:= to n do
y[i,j]:=y[i,j]/x[i,i];
end; procedure main;
var
i,j,k,u,v:longint;
begin
read(n,m,hp);
for i:= to n do read(a[i]);
for i:= to m do
begin
read(u,v);
if u<>v then insert(u,v);
insert(v,u);
end;
work;
f[hp,]:=;
for i:=hp downto do
begin
ff:=f[i];
ans:=ans+ff[n];ff[n]:=;
for j:= to n do f[i,j]:=;
for j:= to n do
for k:= to n do
f[i,j]:=f[i,j]+ff[k]*y[j,k];
ans:=ans+f[i,n];f[i,n]:=;
for j:= to n do
begin
k:=first[j];
while k<> do
begin
if (i-a[last[k]]>) and (a[last[k]]>) then
f[i-a[last[k]],last[k]]:=f[i-a[last[k]],last[k]]+f[i,j]/d[j];
k:=next[k];
end;
end;
end;
writeln(ans::);
end; begin
main;
end.

更新:bzoj上有了题目,但是pascal一直被卡,想了n久,无奈交了std(C++的),突然又想到一个优化,15s+卡过了(好辛酸啊)

3640: JC的小苹果 - BZOJ的更多相关文章

  1. BZOJ 3640: JC的小苹果 [概率DP 高斯消元 矩阵求逆]

    3640: JC的小苹果 题意:求1到n点权和\(\le k\)的概率 sengxian orz的题解好详细啊 容易想到\(f[i][j]\)表示走到i点权为j的概率 按点权分层,可以DP 但是对于\ ...

  2. BZOJ 3640: JC的小苹果

    3640: JC的小苹果 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 425  Solved: 155[Submit][Status][Discus ...

  3. BZOJ 3640 JC的小苹果(逆矩阵)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3640 题意:给出一个无向图,从1走到n.开始是血量H,从u到达v时血量减少a[v] ...

  4. ●BZOJ 3640 JC的小苹果

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3640题解: 期望dp,高斯消元 设dp[i][h]在i位置且血量为h这个状态的期望经过次数. ...

  5. 【BZOJ】3640: JC的小苹果

    题解 我们考虑列出期望方程组,\(dp[i][j]\)表示在第\(i\)个点血量为\(j\)的时候到达\(N\)点的概率,所有的\(dp[N][j]\)都是1,所有\(j < 0\)都是0 答案 ...

  6. 【BZOJ 3640】JC的小苹果 (高斯消元,概率DP)

    JC的小苹果 Submit: 432  Solved: 159 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话 ...

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

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

  8. bzoj千题计划291:bzoj3640: JC的小苹果

    http://www.lydsy.com/JudgeOnline/problem.php?id=3640 dp[i][j] 表示i滴血到达j的概率 dp[i][j] = Σ dp[i+val[i]][ ...

  9. BZOJ3640 : JC的小苹果

    设$f[i][j]$表示$hp$为$i$,在$j$点的概率,$d[i]$表示$i$的度数,$w[i]$表示经过$i$点要扣掉的血量. 对于$j$到$k$这条边,$f[i-w[k]][k]+=\frac ...

随机推荐

  1. (转载)一步一步学Linq to sql系列文章

    现在Linq to sql的资料还不是很多,本人水平有限,如果有错或者误导请指出,谢谢. 一步一步学Linq to sql(一):预备知识 一步一步学Linq to sql(二):DataContex ...

  2. php curl 的用法 转载

    curl 是使用URL语法的传送文件工具,支持FTP.FTPS.HTTP HTPPS SCP SFTP TFTP TELNET DICT FILE和LDAP.curl 支持SSL证书.HTTP POS ...

  3. jquery动态移除/增加onclick属性详解

     本文章给大家介绍利用jquery的removeAttr与attr事件来给a标签增加与删除onclick事件的具体操作方法,有需要了解的朋友可参考. 要实现效果:点击链接先去掉onclick属性,3秒 ...

  4. php_1

    简介:(“PHP: Hypertext Preprocessor”,超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML中,尤其适合 web 开发,语言的风格有 ...

  5. JAVA:三种集合LIST、SET、MAP

    1. 集合框架介绍 我 们知道,计算机的优势在于处理大量的数据,在编程开发中,为处理大量的数据,必须具备相应的存储结构,数组可以用来存储并处理大量类型相同的数 据,但是会发现数组在应用中的限制:数组长 ...

  6. java静态代码块、初始化块和构造方法的执行顺序

    分析:当执行new Child()时,它首先去看父类里面有没有静态代码块,如果有,它先去执行父类里面静态代码块里面的内容,当父类的静态代码块里面的内容执行完毕之后,接着去执行子类(自己这个类)里面的静 ...

  7. CXF和Axis的比较【转】

    在SOA领域,我们认为Web Service是SOA体系的构建单元(building block).对于服务开发人员来说,AXIS和CXF一定都不会陌生.这两个产品都是Apache孵化器下面的Web ...

  8. 洛谷 P3368 【模板】树状数组 2

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

  9. WP开发笔记——页面传参

    WP APP页面与页面之间参数的传递可以通过程序的App类设置全局变量. 由于App 类继承自Application类,而通过Application的Current属性可以获取到与当前程序关联的App ...

  10. 【Qt】Qt Linguist介绍【转】

    简介 Qt提供了一款优秀的支持Qt C++和Qt Quick应用程序的翻译工具.发布者.翻译者和开发者可以使用这款工具来完成他们的任务. 发布者:承担了全面发布应用程序的责任.通常,他们协调开发者和翻 ...