把两种状态化成2*n-2的一条线上的一种状态即可。很容易想到。

高斯列主元法,不知为什么WA。要上课了,不玩了。。。逃了一次课呢。。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
using namespace std;
double const eps=1e-8;
double G[210][210];int n,m,s,e,d; double sum;
double pk[110];
double ans[210];
bool vis[210];
bool find(int i){int k=i;for(int j=i+1;j<n;j++){if(fabs(G[j][i])>fabs(G[k][i]))k=j;}if(fabs(G[k][i])<eps) return false;for(int p=i;p<=n;p++)swap(G[i][p],G[k][p]);return true;
}bool Guass(){for(int i=0;i<n;i++){if(find(i)){for(int j=i+1;j<n;j++){double k=G[j][i]/G[i][i];for(int p=i;p<=n;p++)G[j][p]=G[j][p]-k*G[i][p];}}else return false;}ans[n-1]=G[n-1][n]/G[n-1][n-1];for(int i=n-2;i>=0;i--){double sum=0;for(int j=n-1;j>i;j--){sum+=(G[i][j]*ans[j]);}ans[i]=(G[i][n]-sum)/G[i][i];}return true;
}bool BFS(int s){queue<int>q;q.push(s);memset(vis,false,sizeof(vis));vis[s]=true;while(!q.empty()){int te=q.front();q.pop();for(int i=1;i<=m;i++){if(pk[i]<eps)continue;int u=(te+i)%n;if(!vis[u]){vis[u]=true;q.push(u);if(u==e||u==n-e) return true;}}}return false;
}int main(){int T;scanf("%d",&T);while(T--){scanf("%d%d%d%d%d",&n,&m,&e,&s,&d);sum=0;n=2*n-2;for(int i=1;i<=m;i++){scanf("%lf",&pk[i]);pk[i]/=100;sum+=(i*pk[i]);}if (s == e){   puts ("0.00");   continue;   } if(d==0) s=s;else if(d==1) s=(n-s)%n;memset(G,0,sizeof(G));for(int i=0;i<n;i++){G[i][i]=-1;if(i==e||i==n-e) continue;for(int j=1;j<=m;j++){if(pk[j]<eps)G[i][(j+i)%n]=pk[j];}G[i][n]=-sum;}if(!BFS(s)){puts("Impossible !"); continue;}if(!Guass()){puts("Impossible !");   }else{printf("%.2f\n",ans[s]);}}return 0;
}

  

  这个是别人的

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <queue>
#include <algorithm>
#include <math.h>
using namespace std;
#define M 205
#define eps 1e-8
int equ, var;
double a[M][M], x[M];int Gauss ()
{int i, j, k, col, max_r;for (k = 0, col = 0; k < equ && col < var; k++, col++){max_r = k;for (i = k+1; i < equ; i++)if (fabs (a[i][col]) > fabs (a[max_r][col]))max_r = i;if (k != max_r){for (j = col; j < var; j++)swap (a[k][j], a[max_r][j]);swap (x[k], x[max_r]);}x[k] /= a[k][col];for (j = col+1; j < var; j++) a[k][j] /= a[k][col];a[k][col] = 1;for (i = 0; i < equ; i++) if (i != k){x[i] -= x[k] * a[i][k];for (j = col+1; j < var; j++) a[i][j] -= a[k][j] * a[i][col];a[i][col] = 0;}}return 1;
}//has[x]表示人在x点时的变量号,因为我们只用可达状态建立方程,所以需要编号
int has[M], vis[M], k, e, n, m;
double p[M], sum;int bfs (int u)
{memset (has, -1, sizeof(has));memset (a, 0, sizeof(a));            //忘记初始化WA勒,以后得注意memset (vis, 0, sizeof(vis));int v, i, flg = 0;queue<int> q;q.push (u);k = 0;has[u] = k++;while (!q.empty ()){u = q.front ();q.pop ();if (vis[u]) continue;vis[u] = 1;if (u == e || u == n-e)       //终点有两个,你懂的~{a[has[u]][has[u]] = 1;x[has[u]] = 0;flg = 1;continue;}//E[x] = sum ((E[x+i]+i) * p[i])// ----> E[x] - sum(p[i]*E[x+i]) = sum(i*p[i])a[has[u]][has[u]] = 1;x[has[u]] = sum;for (i = 1; i <= m; i++){//非常重要!概率为0,该状态可能无法到达,如果还去访问并建立方程会导致无解if (fabs (p[i]) < eps) continue;v = (u + i) % n;if (has[v] == -1) has[v] = k++;a[has[u]][has[v]] -= p[i];q.push (v);}}return flg;
}int main()
{int t, s, d, i;scanf ("%d", &t);while (t--){scanf ("%d%d%d%d%d", &n, &m, &e, &s, &d);n = 2*(n-1);sum = 0;for (i = 1; i <= m; i++){scanf ("%lf", p+i);p[i] = p[i] / 100;sum += p[i] * i;}if (s == e){puts ("0.00");continue;}//一开始向左,起点要变if (d > 0) s = (n - s) % n;if (!bfs (s)){puts ("Impossible !");continue;}equ = var = k;Gauss ();printf ("%.2f\n", x[has[s]]);}return 0;
}

  

转载于:https://www.cnblogs.com/jie-dcai/p/4120226.html

HDU 4418 高斯消元法求概率DP相关推荐

  1. HDU 5378 树上的概率DP Leader in Tree Land

    官方题解: 可以用求概率的思想来解决这个问题.令以i号节点为根的子树为第i棵子树,设这颗子树恰好有sz[i]个点.那么第i个点是第i棵子树最大值的概率为1/sz[i],不是最大值的概率为(sz[i]- ...

  2. HDU 4035 Maze(树形概率DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4035 题意:一棵树,从结点1出发,在每个结点 i 都有3种可能:(1)回到结点1 , 概率 Ki:(2 ...

  3. HDU 2955 Robberies(概率DP,01背包)题解

    题意:给出规定的最高被抓概率m,银行数量n,然后给出每个银行被抓概率和钱,问你不超过m最多能拿多少钱 思路:一道好像能直接01背包的题,但是有些不同.按照以往的逻辑,dp[i]都是代表i代价能拿的最高 ...

  4. HDU 3853 LOOPS(概率DP)

    题目链接:点击打开链接 题意:求从(1, 1)点走到(n, m)点的花费能量的期望, 每次决策消耗2点能量. 每次可以原地不动或者向右或者向下, 分别有个概率. 思路:运用全概率期望公式, d[i][ ...

  5. HDU 1493 QQpet exploratory park(概率DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1493 题意:一排有61个格子标号0-60.其中停在5,12, 22, 29, 33, 38, 42, ...

  6. HDU - 6558/概率dp(从后往前推导)

    VJ地址 中文题意: 有一个苦逼程序员小A,他有一个女朋友B,最近看上了一个游戏,他想买这个游戏,可是小A是一个怕老婆的人,每个 月的工资都需要上交,小A找他女朋友商量了好久,最后B同意他用每个月的工 ...

  7. Check the difficulty of problems (概率dp求概率)

    Check the difficulty of problems POJ - 2151 大致题意: m个问题,t个队伍,要求冠军队伍至少解决n个问题,给出每个队伍解决每个问题的概率 求每一个队至少解决 ...

  8. HDU 5001 概率DP || 记忆化搜索

    2014 ACM/ICPC Asia Regional Anshan Online 给N个点,M条边组成的图,每一步能够从一个点走到相邻任一点,概率同样,问D步后没走到过每一个点的概率 概率DP  測 ...

  9. hdu 3853 LOOPS 概率DP

    简单的概率DP入门题 代码如下: 1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 ...

最新文章

  1. 【EF】EF扩展库(批量操作)
  2. python按条件拆分列表元素_如何通过在python中拆分列表元素来创建列表?
  3. 1-3 交换变量(算法竞赛入门经典)
  4. STP状态切换详述(Cisco实现)
  5. python 创建随机数专题
  6. android pickerview 多行,Android PickerView 自定义条件选择器 联动
  7. 软件测试简历职业规划怎么写,职业规划测试
  8. 今日头条推荐算法原理解析
  9. 组织变革-时代发展的产物
  10. 利用$randon和seed可以在测试脚本里面产生测试所需的赋值
  11. vue里面变量名前面加三个点代表什么意思?
  12. jquery获取当前时间戳的正确时间
  13. 服务器三种常见的限流算法
  14. 从零开始SVN(2)--Eclipse、Subclipse、分支开发
  15. 81章 老子1章到_老子1章2章80章81章
  16. c语言程序设计wav,WAV音频格式解析C代码
  17. Swing 入门介绍
  18. CSS3—盒子模型 讲解
  19. MATLAB中BPSK的星座图及误比特率(BER)曲线仿真
  20. java和ansys,HumanResourceManSys

热门文章

  1. 从R中安装phylotaR包
  2. csdn如何自定义博客栏目
  3. opencvsharp_基于轮廓的形状匹配中匹配坐标与旋转角度
  4. android 数据结构详情,Android原生的数据结构
  5. feed流和瀑布流_Feed流和瀑布流 - kathy829的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. 安装fitz报错_解决python 虚拟环境删除包无法加载的问题
  7. java随机生成不重复的数组_Java生成不重复的随机数组的方法
  8. HALCON识别数字ID
  9. AS莫名报错 Error:Could not download junit.jar (junit:junit:4.12): No cached version available
  10. ztree.js的使用整理