HDU 4418 Time travel 期望dp+dfs+高斯消元
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4418
Time travel
Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 32768/32768 K (Java/Others)
#### 问题描述
> Agent K is one of the greatest agents in a secret organization called Men in Black. Once he needs to finish a mission by traveling through time with the Time machine. The Time machine can take agent K to some point (0 to n-1) on the timeline and when he gets to the end of the time line he will come back (For example, there are 4 time points, agent K will go in this way 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, ...). But when agent K gets into the Time machine he finds it has broken, which make the Time machine can't stop (Damn it!). Fortunately, the time machine may get recovery and stop for a few minutes when agent K arrives at a time point, if the time point he just arrive is his destination, he'll go and finish his mission, or the Time machine will break again. The Time machine has probability Pk% to recover after passing k time points and k can be no more than M. We guarantee the sum of Pk is 100 (Sum(Pk) (1 If finishing his mission is impossible output "Impossible !" (no quotes )instead.
输入
There is an integer T (T <= 20) indicating the cases you have to solve. The first line of each test case are five integers N, M, Y, X .D (0< N,M <= 100, 0 <=X ,Y < 100 ). The following M non-negative integers represent Pk in percentile.
输出
For each possible scenario, output a floating number with 2 digits after decimal point
If finishing his mission is impossible output one line "Impossible !"
(no quotes )instead.
样例输入
2
4 2 0 1 0
50 50
4 1 0 2 1
100
样例输出
8.14
2.00
题意
一个人坐时光机,在时间轴上(0~n-1)来回运动,这个人向前运动k步的概率为
p[k](k>=1&&k<=m)
,现在他要从X到Y,给你初始的X和初始运动方向,以及终点Y,问你他到终点时的期望步数。
题解
典型的dfs+高斯消元
首先我们可以把来回走拆成一条直线,如 0 1 2 可以拆成 0 1 2 1。这样就可以循环处理了。
然后dp[i]表示从i点到终点的期望步数,则有dp[i]=sigma(pro[x]*(dp[i+x]+x))
,既sigma(pro[x]*dp[i+x])-dp[i]=-sigma(pro[x]*x)
。列(n-1)*2个方程(只对那些起点可达的列方程),高斯求一下解就可以了。
代码
#include<map>
#include<set>
#include<cmath>
#include<queue>
#include<stack>
#include<ctime>
#include<vector>
#include<cstdio>
#include<string>
#include<bitset>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)
#define scf scanf
#define prf printf
typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII;
const int INF=0x3f3f3f3f;
const LL INFL=0x3f3f3f3f3f3f3f3fLL;
const double eps=1e-9;
const double PI = acos(-1.0);
//start----------------------------------------------------------------------
const int maxn=233;
typedef double Matrix[maxn][maxn];
///n*(n+1)的增广矩阵
bool gauss_jordan(Matrix A,int n) {
int i,j,k,r;
for(i=0; i<n; i++) {
r=i;
for(j=i+1; j<n; j++) {
if(fabs(A[j][i])>fabs(A[r][i])) r=j;
}
if(fabs(A[r][i])<eps) continue;
if(r!=i) for(j=0; j<=n; j++) swap(A[r][j],A[i][j]);
for(k=0; k<n; k++) if(k!=i) {
for(j=n; j>=i; j--) A[k][j]-=A[k][i]/A[i][i]*A[i][j];
}
}
///矛盾式
for(int i=n-1; i>=0&&fabs(A[i][i])<eps; i--) {
if(fabs(A[i][n])>eps) return false;
}
return true;
}
Matrix A;
int n,m,Y,X,D;
int arr[maxn];
double pro[maxn];
int tot;
void get_arr(){
tot=0;
if(X==0){
for(int i=0;i<n;i++) arr[tot++]=i;
for(int i=n-2;i>0;i--) arr[tot++]=i;
}else if(X==n-1){
for(int i=n-1;i>=0;i--) arr[tot++]=i;
for(int i=1;i<n-1;i++) arr[tot++]=i;
}else if(D==0){
for(int i=X;i<n;i++) arr[tot++]=i;
for(int i=n-2;i>=0;i--) arr[tot++]=i;
for(int i=1;i<X;i++) arr[tot++]=i;
}else{
for(int i=X;i>=0;i--) arr[tot++]=i;
for(int i=1;i<n;i++) arr[tot++]=i;
for(int i=n-2;i>X;i--) arr[tot++]=i;
}
}
int vis[maxn];
bool flag=0;
void dfs(int u){
vis[u]=1;
if(arr[u]==Y) flag=true;
for(int i=1;i<=m;i++){
if(fabs(pro[i])<eps) continue;
int des=(u+i)%tot;
if(vis[des]) continue;
dfs(des);
}
}
void init(){
clr(A,0);
clr(vis,0);
}
int main() {
int tc;
scf("%d",&tc);
while(tc--){
scf("%d%d%d%d%d",&n,&m,&Y,&X,&D);
for(int i=1;i<=m;i++){
scf("%lf",&pro[i]); pro[i]/=100;
}
init();
get_arr();
flag=false;
dfs(0);
if(!flag){
prf("Impossible !\n");
continue;
}
for(int i=0;i<tot;i++){
if(!vis[i]) continue;
if(arr[i]==Y){
A[i][i]=1.0;
continue;
}
A[i][i]=-1.0,A[i][tot]=0;
for(int j=1;j<=m;j++){
int des=(i+j)%tot;
A[i][des]+=pro[j];
A[i][tot]-=pro[j]*j;
}
}
bool su=gauss_jordan(A,tot);
if(!su||fabs(A[0][0])<eps) prf("Impossible !\n");
else prf("%.2lf\n",A[0][tot]/A[0][0]);
}
return 0;
}
//end-----------------------------------------------------------------------
HDU 4418 Time travel 期望dp+dfs+高斯消元的更多相关文章
- luogu P4321 随机漫游 期望dp 二进制 高斯消元
LINK:随机漫游 非常妙的一道题. 容易想到倒推期望. 设状态 f[i][j]表示到达第i个点 此时已经到达的集合为j能走到全集的期望边数. 只要求出来这个就能O(1)回答询问. \(f[i][j] ...
- hdu 4418 Time travel 概率DP
高斯消元求期望!! 将n时间点构成2*(n-1)的环,每一点的期望值为dp[i]=dp[i+1]*p1+dp[i+2]*p2+……+dp[i+m]*pm+1. 这样就可以多个方程,利用高斯消元求解. ...
- 【 HDU 4936 】Rainbow Island (hash + 高斯消元)
BUPT2017 wintertraining(15) #5B HDU - 4936 2014 Multi-University Training Contest 7 F 题意 直接看官方的题意和题解 ...
- BZOJ2707 [SDOI2012]走迷宫 【概率dp + tarjan + 高斯消元】
题目 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发的 ...
- 【JLOI 2012】时间流逝(期望,树上高斯消元)
题目链接 这是一道传统的期望题,可是有一些套路值得我去掌握. 我们用$s$来表示一种状态,就是当前拥有的能量圈,是一个正整数拆分的形式. 用$f_{s}$表示如果遇到果冻鱼后丢掉了最小的能量圈后的状态 ...
- hdu4418(概率dp + 高斯消元)
应该是一个入门级别的题目. 但是有几个坑点. 1. 只选择x能到达的点作为guass中的未知数. 2. m可能大于n,所以在构建方程组时未知数的系数不能直接等于,要+= 3.题意貌似说的有问题,D为- ...
- BZOJ 2115 Wc2011 Xor DFS+高斯消元
标题效果:鉴于无向图.右侧的每个边缘,求一个1至n路径,右上路径值XOR和最大 首先,一个XOR并能为一个路径1至n简单的路径和一些简单的XOR和环 我们开始DFS获得随机的1至n简单的路径和绘图环所 ...
- 【BZOJ 2337】 2337: [HNOI2011]XOR和路径(概率DP、高斯消元)
2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1170 Solved: 683 Description ...
- ACM学习历程—HDU 3915 Game(Nim博弈 && xor高斯消元)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3915 题目大意是给了n个堆,然后去掉一些堆,使得先手变成必败局势. 首先这是个Nim博弈,必败局势是所 ...
随机推荐
- PyCharm编辑HTML文件时输入{%不能自动补全
在PyCharm编辑HTML文件时输入Django模板语言时,发现录入 {% 不能自动补全. 找了一下,发现 setting 里可以设置 Python Template Languages,选择自己使 ...
- win7-x64上MySql的初次安装
1.官网:https://dev.mysql.com/downloads/mysql/下载对应的zip包 2.将包解压缩到本地,如:F:\mysql\mysql-8.0.15-winx64 3.配置环 ...
- vue实现菜单切换
vue实现菜单切换,点击菜单导航切换不同的内容以及为当前点击的选项添加样式,或者组件. method里: css: html代码: <nav> <ul> <li> ...
- HTML:5meta标签
<h2>一些常用的移动端的meta属性设置</h2><!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> & ...
- Redis全方位详解--数据类型使用场景和redis分布式锁的正确姿势
一.Redis数据类型 1.string string是Redis的最基本数据类型,一个key对应一个value,每个value最大可存储512M.string一半用来存图片或者序列化的数据. 2.h ...
- 尝试用docker上的jenkins
比起dockerfile的编写,我更习惯使用简单的docker-compose.yml.但是官方的docker-compose.yml并不是独立的.于是经过一番研究,暂时打造了自己的文件: docke ...
- 使用MATLAB工具deploytool打包不成功的解决办法
下面解决方法是来自百度贴吧一抹伊静的解决办法,很好用,非常感谢,现记录下来以便后续查看: 这个问题是2014a 需要破解:下载一个破解文件,原因是matlab未完全破解,2014a的破解办法:http ...
- C#调整图片亮度和对比度
BitmapSource bitmap = null; ; ; private void SetBrightness(int degree) { degree = degree * / ; Write ...
- 苏州Uber优步司机奖励政策(4月21日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- c++ 常量指针
一.指向常量的指针 定义形式: const 类型 * 指针名; 不能通过指针修改地址里的值. int i=0x123; const int *p=&i; *p=; //错误 //前置const ...