hdu 4481 Time travel(高斯求期望)(转)

时间:2022-05-13 04:06:39

(转)http://blog.csdn.net/u013081425/article/details/39240021

http://acm.hdu.edu.cn/showproblem.php?pid=4418

读了一遍题后大体明白意思,但有些细节不太确定。就是当它处在i点处,它有1~m步可以走,但他走的方向不确定呢。后来想想这个方向是确定的,就是他走到i点的方向,它会继续朝着这个方向走,直到转向回头。

首先要解决的一个问题是处在i点处,它下一步该到哪个点。为了解决方向不确定的问题,将n个点转化为2*(n-1)个点。例如当n=4时由原来的0123变为012321,它对应的编号为012345,这样就不用管它哪个方向,统一处理了,当向前走k步时即(i+k)%n。

然后设出dp[i]表示在i点处时到达终点的期望步数,那么可列出转移方程dp[i] = ∑( pk * (dp[ (x+k)%n ] +k) )。但是有些点是永远无法到达的,因此先bfs出所有到达的点,然后列出方程组解方程。

有许多注意的点,判断p[i]是否为0等。

 #include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <list>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
//#define LL __int64
#define LL long long
#define eps 1e-9
#define PI acos(-1.0)
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = ; double p[maxn];
double a[maxn][maxn];//增广矩阵
double X[maxn];//解集
int num[maxn];//给每个能给到达的point离散化
int n,m,x,y,d;
int equ,var,cnt; bool Gauss()
{
int row,col,max_r,i,j;
row = ;
col = ;
while(row < equ && col < var)
{
max_r = row;
for(i = row+; i < equ; i++)
{
if(fabs(a[i][col]) > fabs(a[max_r][col]))
max_r = i;
}
if(max_r != row)
{
for(j = col; j <= var; j++)
swap(a[row][j], a[max_r][j]);
}
if(fabs(a[row][col]) < eps)
{
col++;
continue;
}
for(i = row+; i < equ; i++)
{
if(fabs(a[i][col]) < eps) continue;
double t = a[i][col]/a[row][col];
a[i][col] = 0.0;
for(j = col+; j <= var; j++)
a[i][j] -= a[row][j]*t;
}
row++;
col++;
} for(i = row; i < equ; i++)
if(fabs(a[i][var]) > eps)
return false; //无解
for(i = equ-; i >= ; i--)
{
if(fabs(a[i][i]) < eps) continue;
double t = a[i][var];
for(j = i+; j < var; j++)
t -= a[i][j]*X[j];
X[i] = t/a[i][i];
}
return true;
} void bfs(int s) //bfs找出所有能够到达的点并离散化
{
queue <int> que;
que.push(s);
num[s] = cnt++;
while(!que.empty())
{
int u = que.front();
que.pop();
for(int i = ; i <= m; i++)
{
if(fabs(p[i]) < eps)
continue;
int v = (u+i)%n;
if(num[v] == -)
{
num[v] = cnt++;
que.push(v);
}
}
}
} int main()
{
int test;
scanf("%d",&test);
for(int item = ; item <= test; item++)
{
scanf("%d %d %d %d %d",&n,&m,&y,&x,&d);
for(int i = ; i <= m; i++)
{
scanf("%lf",&p[i]);
p[i] /= ;
}
if(x == y)
{
printf("0.00\n");
continue;
}
n = *(n-);
if(d == )
x = n-x;
memset(num,-,sizeof(num));
cnt = ;
bfs(x);
if(num[y] == - && num[n-y] == -) //注意这里是 &&,只有当两个方向都走不到才算走不到
{
printf("Impossible !\n");
continue;
} memset(a,,sizeof(a));
memset(X,,sizeof(X));
equ = var = cnt; for(int i = ; i < n; i++)
{
if(num[i] != -)
{
if(i == y || i == n-y) //注意特判终点
{
a[num[i]][num[i]] = ;
a[num[i]][cnt] = ;
continue;
}
a[num[i]][num[i]] = ;
for(int j = ; j <= m; j++)
{
int t = (i+j)%n;
if(num[t] != -)
a[num[i]][num[t]] -= p[j];
a[num[i]][cnt] += j*p[j];
}
}
}
if(Gauss())
printf("%.2lf\n",X[num[x]]);
else printf("Impossible !\n");
}
return ;
}

hdu 4481 Time travel(高斯求期望)(转)的更多相关文章

  1. &lbrack;ACM&rsqb; hdu 4418 Time travel &lpar;高斯消元求期望&rpar;

    Time travel Problem Description Agent K is one of the greatest agents in a secret organization calle ...

  2. HDU 5245 Joyful&lpar;概率题求期望&rpar;

    D - Joyful Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit S ...

  3. ZJUT 地下迷宫 (高斯求期望)

    ShowID=1423">http://cpp.zjut.edu.cn/ShowProblem.aspx?ShowID=1423 设dp[i]表示在i点时到达终点要走的期望步数,那么d ...

  4. HDU 3853 LOOP &lpar;概率DP求期望&rpar;

    D - LOOPS Time Limit:5000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit St ...

  5. HDU 4418 Time travel 期望dp&plus;dfs&plus;高斯消元

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4418 Time travel Time Limit: 2000/1000 MS (Java/Othe ...

  6. hdu 4870 rating&lpar;高斯消元求期望&rpar;

    Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  7. HDU4870&lowbar;Rating&lowbar;双号从零单排&lowbar;高斯消元求期望

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4870 原题: Rating Time Limit: 10000/5000 MS (Java/Other ...

  8. HDU 5159 Card &lpar;概率求期望&rpar;

    B - Card Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  9. hdu 4418 Time travel 概率DP

    高斯消元求期望!! 将n时间点构成2*(n-1)的环,每一点的期望值为dp[i]=dp[i+1]*p1+dp[i+2]*p2+……+dp[i+m]*pm+1. 这样就可以多个方程,利用高斯消元求解. ...

随机推荐

  1. paip&period;提升效率---filter map reduce 的java 函数式编程实现

    #paip.提升效率---filter map reduce 的java 函数式编程实现 ======================================================= ...

  2. Swift入门篇-闭包和函数

    今天主要是给大家分享的是 swift中闭包的用法,我个人觉得闭包就是函数的简写方法,如果您函数不是很熟悉请查阅 swift入门篇-函数 1:函数类型 函数类型 var 变量 :(类型)->返回值 ...

  3. 高性能优化Web前端

    高性能HTML 一.避免使用iframe iframe也叫内联frame,可将一个HTML文档嵌入另一个HTML文档中. iframe的好处是,嵌入的文档独立于父文档,通常也借此使浏览器模拟多线程.缺 ...

  4. Machine Learning 学习笔记 &lpar;2&rpar; —— 使用牛顿法寻找极值

    本系列文章允许转载,转载请保留全文! [请先阅读][说明&总目录]http://www.cnblogs.com/tbcaaa8/p/4415055.html 1. 用牛顿法解方程 牛顿法是一种 ...

  5. C使用FILE指针文件操作

    文件的基本概念 所谓“文件”是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名.实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件.库文件 (头文件)等.文件 ...

  6. phpmyadmin导入大sql文件失败解决办法

    摘自:http://www.xunway.com/info/post/499.asp 昨天小编的一个客户在在利用phpmyadmin导入大sql文件的时候,总是提示错误,反应给小编,小编也是第一次遇到 ...

  7. mysql5&period;5主从配置

    mysql主从同步# 一:mysql数据库的主从 mysql数据库5.5之后的版本和5.5以前的版本数据库主从存在差异,这里是针对数据库5.5之后的配置. 1.主库编辑my.cnf(linux的my. ...

  8. C51与汇编混合编程详解

    C51和汇编混合编程(1)-C语言中嵌入汇编 1.在 C文件中要嵌入汇编代码片以如下方式加入汇编代码: #pragma ASM ;Assembler Code Here #pragma ENDASM ...

  9. 新建一个类并绑定一个activity

    1.新建一个类(.java 文件),继承Android.app.Activity 2.新建一个activity 文件 3.重写onCreate 方法,设置绑定activity 文件 @Override ...

  10. Hibernate配置文件current&lowbar;session&lowbar;context&lowbar;class的意思

    转自:http://shuaigg-babysky.iteye.com/blog/563423 此设置的作用如下: What does sessionFactory.getCurrentSession ...