期望,$dp$,高斯消元。

这题需要一些骚操作。首先要将问题的所有情况全部简化为起点开始向右移动(到头了从$0$再继续开始)。例如$n=4$时,将时间轴扩充为$0$ $1$ $2$ $3$ $4$ $3$ $2$ $1$。这样,$d=0$和$d=-1$的时候,就直接是一直往右走就可以了。$d=1$的时候需要另外找一下起点。

因为有可能$p[1]=0$,所以有一些格子本身就走不到,也就是不存在这个状态,所以需要事先预处理好哪些格子可以走到,哪些格子走不到。

$dp$方程比较好写:$dp[i]=sum(dp[i+j]+j)*p[j]$。

对于目标状态或者无法到达的状态,不需要写$dp$方程。其余状态的方程中,目标状态前面的系数均为$0$。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-10;
void File()
{freopen("D:\\in.txt","r",stdin);freopen("D:\\out.txt","w",stdout);
}
template <class T>
inline void read(T &x)
{char c = getchar();x = 0;while(!isdigit(c)) c = getchar();while(isdigit(c)){x = x * 10 + c - '0';c = getchar();}
}int T,n,m,y,x,d,len;
int L[500];
double p[500];
bool f[500];int const maxn = 500;
double a[maxn][maxn],ans[maxn];
bool free_x[maxn];int sgn(double x)
{return (x>eps)-(x<-eps);
}
int gauss()
{int i, j, k;int max_r;int col;double temp;int free_x_num;int free_index;int equ = len,var = len;col = 0;memset(free_x,true,sizeof(free_x));memset(ans,0,sizeof ans);for (k = 0; k < equ && col < var; k++, col++){max_r = k;for (i = k + 1; i < equ; i++){if (sgn(fabs(a[i][col]) - fabs(a[max_r][col]))>0) max_r = i;}if (max_r != k){for (j = k; j < var + 1; j++) swap(a[k][j], a[max_r][j]);}if (sgn(a[k][col]) == 0 ){k--; continue;}for (i = k + 1; i < equ; i++){if (sgn(a[i][col])!=0){double t = a[i][col] / a[k][col];for (j = col; j < var + 1; j++){a[i][j] = a[i][j] - a[k][j] * t;}}}}for(i=k;i<equ;i++)if(sgn(a[i][col])!=0) {return 0;}if (k < var){for (i = k - 1; i >= 0; i--){free_x_num = 0;for (j = 0; j < var; j++){if ( sgn(a[i][j])!=0 && free_x[j]){free_x_num++, free_index = j;}}if(free_x_num>1)    continue;temp = a[i][var];for (j = 0; j < var; j++){if (sgn(a[i][j])!=0 && j != free_index) temp -= a[i][j] * ans[j];}ans[free_index] = temp / a[i][free_index];free_x[free_index] = 0;}return var - k;}for (i = var - 1; i >= 0; i--){temp = a[i][var];for (j = i + 1; j < var; j++){if (sgn(a[i][j])!=0) temp -= a[i][j] * ans[j];}ans[i] = temp / a[i][i];}return 1;
}void bfs()
{memset(f,0,sizeof f);queue<int>q;q.push(x); f[x]=1;while(!q.empty()){int x = q.front(); q.pop();for(int i=1;i<=m;i++){if(p[i]<eps) continue;if(f[(x+i)%len]==0){f[(x+i)%len]=1;q.push((x+i)%len);}}}
}int main()
{scanf("%d",&T);while(T--){scanf("%d%d%d%d%d",&n,&m,&y,&x,&d);for(int i=1;i<=m;i++){int x; scanf("%d",&x);p[i]=1.0*x/100;if(p[i]<eps) p[i]=0;}for(int i=0;i<n;i++) L[i]=i; len=n;int tmp=n-2 ,pos = n; while(tmp>=1) L[pos++]=tmp--;len=pos;if(d==1){for(int i=n;i<=2*(n-1);i++) if(L[i]==x) { x=i; break; }}bfs();bool fail=1;for(int i=0;i<len;i++) if(L[i]==y&&f[i]==1) fail=0;if(fail==1){printf("Impossible !\n");continue;}memset(a,0,sizeof a);for(int i=0;i<len;i++){if(L[i]==y) continue;if(f[i]==0) continue;a[i][i]=-1;for(int j=1;j<=m;j++){if(L[(i+j)%len]==y) a[i][(i+j)%len]=0;else a[i][(i+j)%len]+=p[j];a[i][len]-=p[j]*j;}}gauss();printf("%.2f\n",ans[x]);}return 0;
}

转载于:https://www.cnblogs.com/zufezzt/p/6341604.html

HDU 4418 Time travel相关推荐

  1. hdu 4481 Time travel(高斯求期望)

    http://acm.hdu.edu.cn/showproblem.php?pid=4418 读了一遍题后大体明白意思,但有些细节不太确定.就是当它处在i点处,它有1~m步可以走,但他走的方向不确定呢 ...

  2. HDU 4418 高斯消元法求概率DP

    把两种状态化成2*n-2的一条线上的一种状态即可.很容易想到. 高斯列主元法,不知为什么WA.要上课了,不玩了...逃了一次课呢.. #include <iostream> #includ ...

  3. 【原创】概率DP总结 by kuangbin

    概率DP主要用于求解期望.概率等题目. 转移方程有时候比较灵活. 一般求概率是正推,求期望是逆推.通过题目可以体会到这点. 首先先推荐几篇参考的论文: <信息学竞赛中概率问题求解初探> & ...

  4. 动态规划总结与题目分类

    源博客链接:http://blog.csdn.net/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少 ...

  5. 『ACM-算法-动态规划』初识DP动态规划算法

    一.多阶段决策过程的最优化问题 在现实生活中,有类活 动的过程,由于 它的特殊性,可将过程分成若干个互相阶段.在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.当阶段决策的选取不是任意确 ...

  6. (转)dp动态规划分类详解

    dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间 ...

  7. 《动态规划》— 动态规划分类

    动态规划(英语:Dynamic programming,DP)是一种在数学.计算机科学和经济学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法. 动态规划常常适用于有重叠子问题和最 ...

  8. 我爱机器学习网机器学习类别文章汇总

    机器学习领域的几种主要学习方式 From Stumps to Trees to Forests KDD-2014 – The Biggest, Best, and Booming Data Scien ...

  9. 转:动态规划题目分类

    https://blog.csdn.net/cc_again/article/details/25866971 一.简单基础dp 这类dp主要是一些状态比较容易表示,转移方程比较好想,问题比较基本常见 ...

最新文章

  1. python nginx日志分析_Nginx日志分析及脚本编写
  2. JAVA移慎_谨慎使用Java8的默认方法
  3. 漫谈C#编程语言在游戏领域的应用
  4. 理解Object.defineProperty的作用
  5. $(document).ready() 和 window.onload 的区别
  6. Java 9:流API的增强
  7. 0-1背包问题详解(DP分支限界回溯三种方法)
  8. Oracle中无法解析TNS的陷阱
  9. 西洋的AI作曲家,发布了一张中国风音乐专辑
  10. ORACLE SQL*PLUS
  11. python爬取斗鱼弹幕_【Python3爬虫】斗鱼弹幕爬虫
  12. 程序员 文本编辑器 c语言,程序员必备的五款文本编辑器
  13. 那些年,我们遇到的傻X问题
  14. 在算力“沃土”上,种植互联网下一个奇迹十年
  15. c语言数码管中断器,数码管动态显示 定时器中断 数码管动态显示不正常
  16. 数字IC-1.10 手撕代码之整数乘法和二范数(Verilog HDL数字加减法练习好帮手)
  17. 计算机 绘图 教案,计算机绘图教案.doc
  18. html5清除所有,html5 canvas永久清除
  19. tomcat启动时日志卡在Deploying web application directory解决
  20. 转行软件测试3年了,听前辈说测试前途是IT里最low的,我慌了......

热门文章

  1. json 字符串反序列化成DataSet
  2. 【转】 IIS_WPG 用户组权限问题
  3. 后天的太阳——马云论坚持
  4. 蛮力法在求解“最近对”问题中的应用(JAVA)
  5. activemq控制发送频率_发送activemq
  6. python执行时间长被kill_用python记录运行pid,并在需要时kill掉它们的实例
  7. linux野指针追踪,【华清远见】野指针和空指针的两个小点
  8. python spark hadoop_使用Scala或Python列出存储在Hadoop HDFS上的Spark群集中可用的所有文件?...
  9. java封装264成flv,将H.264封装为FLV格式-Go语言中文社区
  10. Bulk批量操作API的介绍