【HDU】4418 Time travel
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的更多相关文章
- 【HDOJ】4418 Time travel
1. 题目描述K沿着$0,1,2,\cdots,n-1,n-2,n-3,\cdots,1,$的循环节不断地访问$[0, n-1]$个时光结点.某时刻,时光机故障,这导致K必须持续访问时间结点.故障发生 ...
- 【HDU】4888 Redraw Beautiful Drawings 网络流【推断解是否唯一】
传送门:pid=4888">[HDU]4888 Redraw Beautiful Drawings 题目分析: 比赛的时候看出是个网络流,可是没有敲出来.各种反面样例推倒自己(究其原因 ...
- 【HDU】2191 多重背包问题
原题目:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 [算法]多重背包(有限背包) 动态规划 [题解]http://blog.csdn.net/acdreamers/article/detail ...
- 【HDU】6110 路径交(2017百度之星) 线段树+RMQ-LCA+树链的交
[题目]2017"百度之星"程序设计大赛 - 初赛(A) [题意]给定n个点的带边权树,m条编号1~m的路径,Q次询问编号区间[L,R]所有链的交集的长度.n<=500000 ...
- 【HDU】6148 Valley Numer 数位DP
[算法]数位DP [题意]定义V-number为从左到看单位数字未出现先递增后递减现象的数字,求0~N中满足条件的数字个数.T<=200,lenth(n)<=100 [题解]百度之星201 ...
- 【HDU】5269 ZYB loves Xor I
[算法]trie [题解] 为了让数据有序,求lowbit无法直接排序,从而考虑倒过来排序,然后数据就会呈现出明显的规律: 法一:将数字倒着贴在字典树上,则容易发现两数的lowbit就是它们岔道结点的 ...
- 【HDU】3068 最长回文
[算法]manacher [题解][算法]字符串 #include<cstdio> #include<algorithm> #include<cstring> us ...
- 【HDU】2222 Keywords Search
[算法]AC自动机 [题解]本题注意题意是多少关键字能匹配而不是能匹配多少次,以及可能有重复单词. 询问时AC自动机与KMP最大的区别是因为建立了trie,所以对于目标串T与自动机串是否匹配只需要直接 ...
- 【HDU】6012 Lotus and Horticulture (BC#91 T2)
[算法]离散化 [题解] 答案一定存在于区间的左右端点.与区间左右端点距离0.5的点上 于是把所有坐标扩大一倍,排序(即离散化). 让某个点的前缀和表示该点的答案. 初始sum=∑c[i] 在l[i] ...
随机推荐
- Ubuntu下调整swap分区的大小
转自:http://blog.chinaunix.net/uid-7573623-id-2048964.html 由于安装oracle 的时候,swap太小不能继续安装,于是想有什么方法在不不用安装o ...
- SQL中的JOIN类型解释(CROSS, INNER,OUTER),关键字ON,USING
书上讲得明白,解了不少迷惑. SELECT e.fname, e.lname, d.name FROM employee AS e INNER JOIN department AS d ON e.de ...
- HDU1294 Rooted Trees Problem(整数划分 组合数学 DP)
讲解见http://www.cnblogs.com/IMGavin/p/5621370.html, 4 可重组合 dfs枚举子树的节点个数,相乘再累加 1 #include<iostream& ...
- 百度编辑器UEditor ASP.NET示例Demo 分类: ASP.NET 2015-01-12 11:18 346人阅读 评论(0) 收藏
在百度编辑器示例代码基础上进行了修改,封装成类库,只需简单配置即可使用. 完整demo下载 版权声明:本文为博主原创文章,未经博主允许不得转载.
- QQ的账号登录及api操作
.qq.php <?php /** * PHP Library for qq.com * * @author */ class qqPHP { function __construct($app ...
- C++中引用(&)的用法和应用实例
转自:http://www.cnblogs.com/Mr-xu/archive/2012/08/07/2626973.html 对于习惯使用C进行开发的朋友们,在看到c++中出现的&符号,可能 ...
- git checkout 命令详解
转自:http://www.cnblogs.com/hutaoer/archive/2013/05/07/git_checkout.html?utm_source=tuicool&utm_me ...
- 1.CoreLocation 使用,获取当前位置
1. ios7只要开始定位,系统就会自动要求你对应用程序授权 ios8之后,必须要代码中实现要求用户对应用程序授权 ,在plist中添加以下两个属性 NSLocationWhenInUseDescri ...
- JavaScrip入门(3)
函数: var m2=function(){ console.log('2222'); } console.log(typeof(m2)); 输出结果:test.html:31 function js ...
- chrome插件
自备FQ神器,或者在公司浏览谷歌商店.话说我们公司电脑可以打开谷歌商店. 1.Performance-Analyser(网页性能分析) 这款插件是用来分析你的网页加载性能的,包括http请求,执行期的 ...