CodeForces 605E Intergalaxy Trips 题解
题意
有一张
个点的有向完全图,边 有 的概率出现( )。你要从 开始,每天可以走一条出边或留在原地,求最优策略下走到 的期望天数。输出小数(不取模)。
思路
设
首先考虑怎么转移
考虑当前我们在
现在就可以把方程写出来了:
但是这个式子需要依赖已经计算好的
我们观察发现,由于
其实还有另一种解释,因为我们总是可以原地停留的,所以我们不可能从
所以,
先把移项过后的式子写出来:
现在考虑怎么找出 DAG 的形态。
首先
考虑这些
现在我们证明
首先发现一个性质,对于任意时刻的
然后就很简单了,因为
代码
代码其实很好写。
代码
#include <bits/stdc++.h>
const int N = 1e3 + 5;
int n;
double p[N][N];
double f[N], g[N], h[N];
bool done[N];
void trans(int j, int i) { g[i] += p[i][j] * f[j] * h[i], h[i] *= 1 - p[i][j], f[i] = g[i] / (1 - h[i]); }
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) { int x; scanf("%d", &x); p[i][j] = x / 100.0; }
for(int i = 1; i <= n; i++) f[i] = g[i] = h[i] = 1;
done[n] = true, f[n] = 0;
for(int i = 1; i <= n; i++) if(!done[i]) trans(n, i);
for(int _ = 2; _ <= n; _++) {
int now = 0;
double val = 1e18;
for(int i = 1; i <= n; i++) if(!done[i] && f[i] < val) now = i, val = f[i];
done[now] = true;
for(int i = 1; i <= n; i++) if(!done[i]) trans(now, i);
}
printf("%.6lf\n", f[1]);
return 0;
}
参考资料
https://www.luogu.com.cn/blog/SDNetFriend/solution-cf605e
https://www.luogu.com.cn/blog/LCA/solution-cf605e
https://www.luogu.com.cn/blog/user33243/solution-cf605e
https://codeforces.com/blog/entry/22019
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】