【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 我做这题的思路就是采用暴力或者贪心.也就是每次循环选出从第一个未被选择的元素开始,依次把后面可以选择的元素作为一个系统.最后统计可以有多少个系统. 还有人的思路就是利 ...
随机推荐
- odoo tree视图 当页不弹窗显示方法
<xpath expr="//tree" position="attributes"> <attribute name='editable'& ...
- 使用jdb调试apk
jdb是一个支持java代码级调试的工具,它是由java jdk提供的,存在于xxx\Java\jdk1.6.0_21\bin之下 使用ddms调试时,主机会打开另外一个网络端口,在DDMS里查看,一 ...
- 20155317 十六周second 取值
20155317 十六周second 取值 题目如下图: secondset #define base 0xFFFFC0000 # #define &clock void setsecond( ...
- Android开发——RecyclerView特性以及基本使用方法(一)
)关于点击事件,没有像ListView那样现成的API,但是自己封装起来也不难,而且我们使用ListView时,如果item中有可点击组件,那么点击事件的冲突也是一个问题,而在RecyclerView ...
- 28 个 C/C++ 开源 JSON 程序库性能及标准符合程度评测
28 个 C/C++ 开源 JSON 程序库性能及标准符合程度评测 坊间有非常多的 C/C++ JSON 库,怎么选择是一个难题. [nativejson-benchmark](https://git ...
- linux 升级 5.0.2内核
1.下载 wet https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.0.2.tar.xz -o /usr/src/ cd /usr/src ta ...
- Photoshop CS4破解方法
先在网上下载Photoshop CS4的版本,安装后按如下步骤操作即可. 激活码: 1330-1082-3503-2270-3738-6738 1330-1776-8671-6289-7706-291 ...
- 4字节emoji表情对应的Unicode编码获取和编码转换
GitHub Flavored Markdown 今天研究了一天Markdown移动端和pc端统一实现方式,由于以前有搞过移动端富文本编辑器,搞Markdown简单多了: 其中GFM的表情语法不错,比 ...
- 【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面
本系列文章都会以一个程序的实例开发为主线来进行讲解,以求达到一个循序渐进的学习效果,这样更能加深大家对于程序为什么要这样写的用意,理论加上实际的应用才能达到事半功倍的效果,不是吗? 最下方有源码的下载 ...
- 最简单的iOS网络请求
做iOS开发,说到网络请求,大家可能都不约而同的提到AFN,可以说大家的网络请求都是用AFN封装而成,AFN的强大易用的确很好. 但是版本升级就会出现一些问题,所以就自己基于iOS原生封装了一个网络请 ...