Intergalaxy Trips
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

The scientists have recently discovered wormholes — objects in space that allow to travel very long distances between galaxies and star systems.

The scientists know that there are n galaxies within reach. You are in the galaxy number 1 and you need to get to the galaxy number n. To get from galaxy i to galaxy j, you need to fly onto a wormhole (i, j) and in exactly one galaxy day you will find yourself in galaxy j.

Unfortunately, the required wormhole is not always available. Every galaxy day they disappear and appear at random. However, the state of wormholes does not change within one galaxy day. A wormhole from galaxy i to galaxy j exists during each galaxy day taken separately with probability pij. You can always find out what wormholes exist at the given moment. At each moment you can either travel to another galaxy through one of wormholes that exist at this moment or you can simply wait for one galaxy day to see which wormholes will lead from your current position at the next day.

Your task is to find the expected value of time needed to travel from galaxy 1 to galaxy n, if you act in the optimal way. It is guaranteed that this expected value exists.

Input

The first line of the input contains a single integer n (1 ≤ n ≤ 1000) — the number of galaxies within reach.

Then follows a matrix of n rows and n columns. Each element pij represents the probability that there is a wormhole from galaxy i to galaxy j. All the probabilities are given in percents and are integers. It is guaranteed that all the elements on the main diagonal are equal to 100.

Output

Print a single real value — the expected value of the time needed to travel from galaxy 1 to galaxy n if one acts in an optimal way. Your answer will be considered correct if its absolute or relative error does not exceed 10 - 6.

Namely: let's assume that your answer is a, and the answer of the jury is b. The checker program will consider your answer correct, if .

Sample test(s)
input
3
100 50 50
0 100 80
0 0 100
output
1.750000000000000
input
2
100 30
40 100
output
3.333333333333333
Note

In the second sample the wormhole from galaxy 1 to galaxy 2 appears every day with probability equal to 0.3. The expected value of days one needs to wait before this event occurs is .

题意:有n个点,每天可以从i到j的概率是P(i, j),每天也可以选择留在原地,问去到n的期望天数。

分析:这题是这样的。

如果我们从终点往前推,会简单很多。因为从前往后的话很难确定有哪些点转移到自身。

从终点开始的话,显然一开是在终点的天数是0。

又发现,每个点显然只能从更优(期望更小)的点转移到自己。

由于是从后往前推,所以这意味这已经推过的点不会再推。

所以,这是一个类似最短路的过程。

推的过程是这样的

设比x点优秀的点是v[1],v[2].....v[c]

那么x的期望显然满足

dp[x] = dp[v[1]] * p(x, v[1]) + dp[v[2]] * p(x, v[2]) * (1 - p(x, v[1]) ) + dp[v[3]] * p(x, v[3]) * (1 - p(x, v[2]) ) * (1 - p(x, v[1]) ) + ..... + dp[v[c]] * p(x, v[c]) * (1 - p(x, v[2]) ) * (1 - p(x, v[1]) ) * ..... * (1 - p(x, v[c - 1])) + dp[x] * (1 - p(x, v[2]) ) * (1 - p(x, v[1]) ) * ..... * (1 - p(x, v[c])) + 1

其中(1 - p(x, v[2]) ) * (1 - p(x, v[1]) ) * ..... * (1 - p(x, v[c]))是它留在原地的概率。

然后变形

dp[x] = (    dp[v[1]] * p(x, v[1]) + dp[v[2]] * p(x, v[2]) * (1 - p(x, v[1]) ) + dp[v[3]] * p(x, v[3]) * (1 - p(x, v[2]) ) * (1 - p(x, v[1]) ) + ..... + dp[v[c]] * p(x, v[c]) * (1 - p(x, v[2]) ) * (1 - p(x, v[1]) ) * ..... * (1 - p(x, v[c - 1]))      + 1    ) / (1 -  (1 - p(x, v[2]) ) * (1 - p(x, v[1]) ) * ..... * (1 - p(x, v[c])) )

这样就可以转移了。。。

 /**
Create By yzx - stupidboy
*/
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <ctime>
#include <iomanip>
using namespace std;
typedef long long LL;
typedef double DB;
#define MIT (2147483647)
#define INF (1000000001)
#define MLL (1000000000000000001LL)
#define sz(x) ((int) (x).size())
#define clr(x, y) memset(x, y, sizeof(x))
#define puf push_front
#define pub push_back
#define pof pop_front
#define pob pop_back
#define mk make_pair inline int Getint()
{
int Ret = ;
char Ch = ' ';
bool Flag = ;
while(!(Ch >= '' && Ch <= ''))
{
if(Ch == '-') Flag ^= ;
Ch = getchar();
}
while(Ch >= '' && Ch <= '')
{
Ret = Ret * + Ch - '';
Ch = getchar();
}
return Flag ? -Ret : Ret;
} const DB EPS = 1e-;
const int N = ;
int n, data[N][N];
DB dp[N], stay[N], cnt[N];
bool visit[N]; inline void Input()
{
scanf("%d", &n);
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
scanf("%d", &data[i][j]);
} inline void Solve()
{
for(int i = ; i <= n; i++) dp[i] = INF, stay[i] = 1.0, cnt[i] = 0.0;
dp[n] = ;
for(int k = ; k <= n; k++)
{
int idx = -;
DB mn = INF;
for(int i = ; i <= n; i++)
if(!visit[i] && mn >= dp[i])
mn = dp[i], idx = i; if(idx == )
{
printf("%.12lf\n", dp[]);
break;
} visit[idx] = ;
for(int i = ; i <= n; i++)
if(!visit[i])
{
cnt[i] += stay[i] * dp[idx] * (0.01 * data[i][idx]);
stay[i] *= - 0.01 * data[i][idx];
if(fabs( - stay[i]) > EPS)
dp[i] = ( + cnt[i]) / ( - stay[i]);
}
}
} int main()
{
freopen("a.in", "r", stdin);
Input();
Solve();
return ;
}

CF#335 Intergalaxy Trips的更多相关文章

  1. 【CF605E】Intergalaxy Trips(贪心,动态规划)

    [CF605E]Intergalaxy Trips(贪心,动态规划) 题面 Codeforces 洛谷 有\(n\)个点,每个时刻第\(i\)个点和第\(j\)个点之间有\(p_{ij}\)的概率存在 ...

  2. CodeForces 605 E. Intergalaxy Trips

    E. Intergalaxy Trips time limit per test:2 seconds memory limit per test:256 megabytes input:standar ...

  3. CF605E Intergalaxy Trips

    CF605E Intergalaxy Trips 考虑你是不知道后来的边的出现情况的,所以可以这样做:每天你都选择一些点进行观察,知道某天往这些点里面的某条边可用了,你就往这条边走.这样贪心总是对的. ...

  4. CF#335 Freelancer's Dreams

    Freelancer's Dreams time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  5. CF#335 Board Game

    Board Game time limit per test 2.5 seconds memory limit per test 256 megabytes input standard input ...

  6. CF#335 Lazy Student

    Lazy Student time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  7. CF#335 Sorting Railway Cars

    Sorting Railway Cars time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  8. CF #335 div1 A. Sorting Railway Cars

    题目链接:http://codeforces.com/contest/605/problem/A 大意是对一个排列进行排序,每一次操作可以将一个数字从原来位置抽出放到开头或结尾,问最少需要操作多少次可 ...

  9. [Codeforces]605E Intergalaxy Trips

    小C比较棘手的概率期望题,感觉以后这样的题还会贴几道出来. Description 给定一个n*n的邻接矩阵,邻接矩阵中元素pi,j表示的是从 i 到 j 这条单向道路在这一秒出现的概率百分比,走一条 ...

随机推荐

  1. C 替换字符方法--1

    #include "stdafx.h" //linux 底下要去掉这一行 #include <stdio.h> #include<stdlib.h> #in ...

  2. hdu 1203

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1203 思路:01背包问题,求一份都拿不到的概率,状态转移方程dp[j]=min(dp[j],dp[j- ...

  3. js获取url方法

    //设置或获取对象指定的文件名或路径.alert(window.location.pathname); //设置或获取整个 URL 为字符串.alert(window.location.href); ...

  4. kvm 网桥

    root@ok Downloads]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 HWADDR=54:EE:75:4E:37: ...

  5. 【JAVA集合框架之Set】

    一.Set概述. Set集合的特点是元素不允许重复,而且是无序的(添加和取出的顺序不一致). Set接口中的方法和Collection接口中的方法几乎相同,略. Set接口下常用的两个类:HashSe ...

  6. Cube Processing Options

    在 Microsoft SQL Server Analysis Services 中处理对象时,您可以选择处理选项以控制每个对象的处理类型.  处理类型因对象而异,并基于自上次处理对象后对象所发生的更 ...

  7. hdu 2516 FIB博弈

    分析请看:cxlove #include<iostream> #include<cstdio> #include<cstring> #include<algo ...

  8. C++ 中 char 与 int 转换问题

    itoa 功  能:把一整数转换为字符串 函  数:char *itoa(int value, char *string, int radix); 解  释:itoa 是英文integer to ar ...

  9. How to use the Visual Studio

    推荐一个提供VS配色方案的一个网站:StudioStyles,域名和网站同名:http://studiostyl.es/ 2. 整行剪切:Ctrl + X.光标不要选中任何文字,然后按这个快捷键就可以 ...

  10. NSFileManager 的基本使用方法

    本方法已有个人总结, int main(int argc, const char * argv[]) { @autoreleasepool { NSString *path=@"/Users ...