【CF605E】Intergalaxy Trips(贪心,动态规划)
【CF605E】Intergalaxy Trips(贪心,动态规划)
题面
Codeforces
洛谷
有\(n\)个点,每个时刻第\(i\)个点和第\(j\)个点之间有\(p_{ij}\)的概率存在一条边。每个时刻可以沿着一条边走或者留在原地。求从\(1\)号点走到\(n\)号点的最优的期望时间。
题解
设\(E(x)\)表示从\(x\)走到\(n\)的最短期望时间,那么考虑当前停的这个点的下一步应该怎么走,首先,你一定会走向当前能够到达的所有点中,\(E(x)\)最小的那个,而如果所有可以到达的点的\(E(x)\)都大于当前点的期望,那么一定会留在原地。
抓住这样一个性质:我们不会走向期望比当前点的期望更加大的点。那么我们从小往大依次考虑出所有点的期望。这样子每次拓展一个点的复杂度就是\(O(n)\)的,一共拓展\(n\)轮,所以总的复杂度就是\(O(n^2)\)。
转移大概是这样的,我们假装所有后继都是按照\(E(x)\)从小往大枚举的。
\(E(x)=\sum_{i}E(i)*p_{xi}\prod_{j=1}^{i-1}(1-p_{xj})\)
即考虑所有可以选择的后继,因为我们肯定当前出现的所有边中,期望最小的那个走,所以当前这条边被选定的概率就是前面所有边都没有被选中的概率乘上这条边出现了的概率。
那么,我们考虑每次选定的最小期望,显然不会用比他大的期望去更新他,既然它是当前最小,那么所有未确定的点的期望都不可能用来更新这个点,所以当前确定的就一定是这个点。
注意一点,如果你确定了一个点之后,当前得到的这个值并不是实际的期望,考虑用来更新的那些边都没有出现,这个的概率是\(\prod (1-p_{xj})\),那么这么多的概率你会停留在原地,把它减过去再除过来,即还要除掉一个\(1-\prod p\)才是最终的期望。
#include<iostream>
#include<cstdio>
using namespace std;
#define ll long long
#define MAX 1010
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
int n,Q[MAX],h,t;
bool use[MAX],vis[MAX];
double E[MAX],p[MAX][MAX],prod[MAX];
int main()
{
n=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
p[i][j]=read()/100.00;
if(n==1){puts("0");return 0;}
for(int i=1;i<=n;++i)E[i]=1,prod[i]=1-p[i][n];
E[n]=0;vis[n]=true;
for(int i=1;i<=n;++i)
{
int u=0;double mn=1e18;
for(int j=1;j<=n;++j)
if(!vis[j]&&E[j]/(1-prod[j])<mn)
u=j,mn=E[j]/(1-prod[j]);
vis[u]=true;if(u==1){printf("%.10lf\n",E[1]/(1-prod[1]));return 0;}
for(int j=1;j<=n;++j)
E[j]+=(E[u]/(1-prod[u]))*p[j][u]*prod[j],prod[j]*=(1-p[j][u]);
}
return 0;
}
【CF605E】Intergalaxy Trips(贪心,动态规划)的更多相关文章
- CF605E Intergalaxy Trips 贪心 概率期望
(当时写这篇题解的时候,,,不知道为什么,,,写的非常冗杂,,,不想改了...) 题意:一张有n个点的图,其中每天第i个点到第j个点的边都有$P_{i, j}$的概率开放,每天可以选择走一步或者留在原 ...
- CF605E Intergalaxy Trips
CF605E Intergalaxy Trips 考虑你是不知道后来的边的出现情况的,所以可以这样做:每天你都选择一些点进行观察,知道某天往这些点里面的某条边可用了,你就往这条边走.这样贪心总是对的. ...
- CF#335 Intergalaxy Trips
Intergalaxy Trips time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- 【51Nod】1510 最小化序列 贪心+动态规划
[题目]1510 最小化序列 [题意]给定长度为n的数组A和数字k,要求重排列数组从而最小化: \[ans=\sum_{i=1}^{n-k}|A_i-A_{i+k}|\] 输出最小的ans,\(n \ ...
- CodeForces 605 E. Intergalaxy Trips
E. Intergalaxy Trips time limit per test:2 seconds memory limit per test:256 megabytes input:standar ...
- nyoj 16-矩形嵌套(贪心 + 动态规划DP)
16-矩形嵌套 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:13 submit:28 题目描述: 有n个矩形,每个矩形可以用a,b来描述,表示长和 ...
- POJ1065 Wooden Sticks(贪心+动态规划——单调递减或递增序列)
描述 C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于 第i个处理的木棒,那么将不会耗费时间,否则 ...
- BZOJ 3227 [Sdoi2008]红黑树(tree) ——贪心 动态规划
首先可以想到一个贪心的方法,然后一层一层的合并. 也可以采用动态规划的方式,为了写起来好写,把点数*2+1,然后发现在本机上跑不过1500的数据. 交上去居然A掉了. 贪心 #include < ...
- HDOJ-1257(贪心/动态规划)
最少拦截系统 HDOJ-1257 我做这题的思路就是采用暴力或者贪心.也就是每次循环选出从第一个未被选择的元素开始,依次把后面可以选择的元素作为一个系统.最后统计可以有多少个系统. 还有人的思路就是利 ...
随机推荐
- 20155330 《网络对抗》 Exp5 MSF基础应用
20155330 <网络对抗> Exp5 MSF基础应用 实践过程记录 主动攻击实践:MS08_067漏洞攻击 攻击机:kali IP地址:192.168.124.132 靶机:windo ...
- Android开发——高斯模糊效果的简单实现
0. 前言 在Android开发中,经常在音乐软件中看到高斯模糊效果. 在找遍了所有高斯模糊的算法代码后,发现stackblur的Java实现是最快的.效果如下所示. 1. 高斯模糊效果实现 Bit ...
- LOJ#6354. 「CodePlus 2018 4 月赛」最短路[最短路优化建图]
题意 一个 \(n\) 个点的完全图,两点之间的边权为 \((i\ xor\ j)*C\) ,同时有 \(m\) 条额外单向路径,问从 \(S\) 到 \(T\) 的最短路. \(n\leq 10^5 ...
- Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries
目录 上篇回顾 Building Queries 匹配所有的查询 全文查询 Full Text Queries 什么是全文查询? Match 全文查询 API 列表 基于词项的查询 Term Term ...
- stl源码剖析 详细学习笔记 仿函数
//---------------------------15/04/01---------------------------- //仿函数是为了算法而诞生的,可以作为算法的一个参数,来自定义各种操 ...
- ECS centos7 使用外部邮件服务商的465加密端口
ECS centos7 使用外部邮件服务商的465加密端口发送邮件. 1.修改/etc/mail.rc 文件中添加以下的 set smtp="smtps://smtp.163.com:465 ...
- OPPO A7X 刷机小结
OPPO A7X 刷机小结: 概述:根据网上找到的教程(MTK模式刷机教程),没有成功.在QQ上询问一位提供刷机服务的大神,说是只有老版本才能刷. 操作步骤: 刷机工具: MediaTek SP Fl ...
- muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor
目录 muduo网络库学习笔记(五) 链接器Connector与监听器Acceptor Connector 系统函数connect 处理非阻塞connect的步骤: Connetor时序图 Accep ...
- FFMpeg笔记(六) 滤镜命名规则及使用libavfilter对视频尺寸进行裁切
在ffmpeg框架中,滤镜(filter)功能通过libavfilter库实现. 一个filter可以同时有多个输入和输出.以图为例: 图中的一系列操作共使用了四个filter,分别是 spli ...
- ubuntu server安装OVS
安装 Open vSwitch (Ubuntu Server 16.04) 1.查看主机系统内核版本:uname –a 2.上传openvswitch软件包,解压后执行安装: 更新下载源 $ sud ...