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

题意:一个0~n-1的坐标轴,给出起点X、终点Y,和初始方向D(0表示从左向右、1表示从右向左,-1表示起点或终点),在走的过程中如果到达起点或终点,那么下一步往反方向走。每次可以走1~m步,每步概率为p[i],问走到终点的期望步数。(n,m,X,Y<=100)

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=205;
const double eps=1e-6;
double A[N][N], p[N], C;
inline double abs(double x) { return x<0?-x:x; } int guass(int n, int m) {
int x=1, y=1;
while(x<=n && y<=m) {
int pos=x;
for(int i=x+1; i<=n; ++i) if(abs(A[i][y])>abs(A[pos][y])) pos=i;
if(abs(A[pos][y])<eps) { ++y; continue; }
for(int i=1; i<=m+1; ++i) swap(A[x][i], A[pos][i]);
for(int i=x+1; i<=n; ++i) if(abs(A[i][y])>=eps) {
double t=A[i][y]/A[x][y];
for(int j=y; j<=m+1; ++j) A[i][j]-=t*A[x][j];
}
++x; ++y;
}
for(int i=x; i<=n; ++i) if(abs(A[i][m+1])>=eps) return 0;
for(int i=m; i; --i) if(abs(A[i][i])>=eps) {
for(int j=i+1; j<=m; ++j) A[i][m+1]-=A[j][m+1]*A[i][j];
A[i][m+1]/=A[i][i];
}
return 1;
}
bool vis[N];
int n, m, X, Y, D, all;
void get(int now, double a[]) {
if(!vis[now]) { a[now]=1; return; }
int fx=1, x=now;
if(x>n) fx=-1;
for(int i=1; i<=m; ++i) {
if(x==n) { fx=-1; x=all; }
else if(x==n+1) { fx=1; x=1; }
x+=fx;
a[x]+=p[i];
}
a[now]-=1;
a[all+1]=-C;
}
void bfs() {
static int q[N], front, tail, x, fx;
memset(vis, 0, sizeof(bool)*(all+1));
front=tail=0; q[tail++]=X+D*n;
while(front!=tail) {
x=q[front++]; if(front==N) front=0;
fx=1;
if(x>n) fx=-1;
for(int i=1; i<=m; ++i) {
if(x==n) { fx=-1; x=all; }
else if(x==n+1) { fx=1; x=1; }
x+=fx;
if(!vis[x] && abs(p[i])>=eps) { vis[x]=1; q[tail++]=x; if(tail==N) tail=0; }
}
}
vis[1]=vis[all]=vis[Y]=vis[Y+n]=0;
}
int main() {
int T; scanf("%d", &T);
while(T--) {
scanf("%d%d%d%d%d", &n, &m, &Y, &X, &D); ++X; ++Y;
C=0;
for(int i=1; i<=m; ++i) scanf("%lf", &p[i]), p[i]/=100, C+=p[i]*i;
if(X==Y) { puts("0.00"); continue; }
if(D==-1) { if(X==1) D=1; else D=0; }
all=n<<1;
bfs();
for(int i=1; i<=all; ++i) { memset(A[i], 0, sizeof(double)*(all+2)); get(i, A[i]); }
if(guass(all, all)) {
if(abs(A[X+D*n][all+1])<eps) puts("Impossible !");
else printf("%.2f\n", A[X+D*n][all+1]);
}
else puts("Impossible !");
}
return 0;
}

  

这题我是调得憔悴啊QAQ

1、首先一开始我并没有想到有非法状态(即转移不到的状态我照样让他进了高斯中的矩阵中QAQ)

2、D=-1的条件漏看了啊,导致我sb的提交了20+次然后每次都是RE QAQ 妈妈呀...

首先方程和高斯消元比较显然..

设$d[i]$表示从$i$走到达终点所需要的步数:

$$d[i]=\sum_{k=1}^{m} p[k](d[转移到k步后]+k)$$

变换一下变成:

$$\sum_{k=1}^{m} p[k]d[转移到k步后] - d[i] = -\sum_{k=1}^{m} p[k]*k$$

发现这和方向其实是有关的,那么我们可以变成两个状态:

$1<=i<=n$,$d[i]$表示从左向右,$d[i+n]$表示从右向左。判断一些非法状态即可

可是这样是有问题的,在某些情况下可能某个$i$没有合法被访问过,那么就要bfs一次....(因为概率为0的时候是不会访问的啊QAQ所以不要放入合法状态中...)

(至此概率期望dp完结撒花(咦为什么我做了12天才搞完?(妈妈呀,这效率太低了啊.

【HDU】4418 Time travel的更多相关文章

  1. 【HDOJ】4418 Time travel

    1. 题目描述K沿着$0,1,2,\cdots,n-1,n-2,n-3,\cdots,1,$的循环节不断地访问$[0, n-1]$个时光结点.某时刻,时光机故障,这导致K必须持续访问时间结点.故障发生 ...

  2. 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】

    传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因 ...

  3. 【HDU】2191 多重背包问题

    原题目:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 [算法]多重背包(有限背包) 动态规划 [题解]http://blog.csdn.net/acdreamers/article/detail ...

  4. 【HDU】6110 路径交(2017百度之星) 线段树+RMQ-LCA+树链的交

    [题目]2017"百度之星"程序设计大赛 - 初赛(A) [题意]给定n个点的带边权树,m条编号1~m的路径,Q次询问编号区间[L,R]所有链的交集的长度.n<=500000 ...

  5. 【HDU】6148 Valley Numer 数位DP

    [算法]数位DP [题意]定义V-number为从左到看单位数字未出现先递增后递减现象的数字,求0~N中满足条件的数字个数.T<=200,lenth(n)<=100 [题解]百度之星201 ...

  6. 【HDU】5269 ZYB loves Xor I

    [算法]trie [题解] 为了让数据有序,求lowbit无法直接排序,从而考虑倒过来排序,然后数据就会呈现出明显的规律: 法一:将数字倒着贴在字典树上,则容易发现两数的lowbit就是它们岔道结点的 ...

  7. 【HDU】3068 最长回文

    [算法]manacher [题解][算法]字符串 #include<cstdio> #include<algorithm> #include<cstring> us ...

  8. 【HDU】2222 Keywords Search

    [算法]AC自动机 [题解]本题注意题意是多少关键字能匹配而不是能匹配多少次,以及可能有重复单词. 询问时AC自动机与KMP最大的区别是因为建立了trie,所以对于目标串T与自动机串是否匹配只需要直接 ...

  9. 【HDU】6012 Lotus and Horticulture (BC#91 T2)

    [算法]离散化 [题解] 答案一定存在于区间的左右端点.与区间左右端点距离0.5的点上 于是把所有坐标扩大一倍,排序(即离散化). 让某个点的前缀和表示该点的答案. 初始sum=∑c[i] 在l[i] ...

随机推荐

  1. Pyqt清空Win回收站

    Pyqt清空回收站其实的调用Python的第三方库,通过第三方库调用windows的api删除回收站的数据 一. 准备工作 先下载第三方库winshell 下载地址: https://github.c ...

  2. I-number

    以下是真坑爹题目: 此题必须输出前导零,否则永远a不了 I-number Time Limit: 5000MS Memory limit: 65536K 题目描述 The I-number of x ...

  3. 对数据库触发器new和old的理解

    在数据库的触发器中经常会用到更新前的值和更新后的值,所有要理解new和old的作用很重要.当时我有个情况是这样的:我要插入一行数据,在行要去其他表中获得一个单价,然后和这行的数据进行相乘的到总金额,将 ...

  4. .NET Framework 4 与 .NET Framework 4 Client Profile

    今天碰到的一个问题和Client Profile相关的.问题是这样的:一个WPF工程,需要引用另外几个.NET的assembly, 在WPF工程中添加了对这几个assembly的引用,并在程序中可以添 ...

  5. PGA

    Server Process PGA   1.PGA作用   2.PGA構成      1)private sql area      2)session memory          3)sql ...

  6. Oracle性能优化之SQL语句

    1.SQL语句执行过程 1.1 SQL语句的执行步骤 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. ...

  7. JDK 1.5 1.6 override区别

    今天在更新时发现有个别项目报错,报错信息 到网上搜索了之后,根据网上描述,修改了一批配置都不行: http://bestchenwu.iteye.com/blog/997420(这个里面的方法二,即为 ...

  8. Codeforces Round #369 (Div. 2) C. Coloring Trees DP

    C. Coloring Trees   ZS the Coder and Chris the Baboon has arrived at Udayland! They walked in the pa ...

  9. xUtils,butterknife...处理findviewbyid

      在写android中,经常要出现大量的findviewbyid et_path = (EditText) findViewById(R.id.et_path); tv_info = (TextVi ...

  10. Java学习随笔1:Java是值传递还是引用传递?

    Java always passes arguments by value NOT by reference. Let me explain this through an example: publ ...