应该是一个入门级别的题目。

但是有几个坑点。

1. 只选择x能到达的点作为guass中的未知数。

2. m可能大于n,所以在构建方程组时未知数的系数不能直接等于,要+=

3.题意貌似说的有问题,D为-1的时候,和题目说的不一样.

//
// main.cpp
// hdu4418
//
// Created by New_Life on 16/8/9.
// Copyright © 2016年 chenhuan001. All rights reserved.
// //高斯消元模板: 浮点数 #include <iostream>
#include <stdio.h>
#include <string.h>
#define maxn 210
#define N 210
#define CL(a,num) memset((a),(num),sizeof(a))
#define iabs(x) ((x) > 0 ? (x) : -(x))
#define EPS 1e-8
using namespace std;
int equ,var;//方程个数和自由元的个数
double a[maxn][maxn];
double x[maxn],free_x[maxn];//解集 void Debug()
{
int i,j;
for(i=0;i<equ;i++){
for(j=0;j<var+1;j++)
printf("%.2lf ",a[i][j]);
cout<<endl;
}
} int zero(double x)
{
if( iabs(x)<EPS ) return 1;
return 0;
}
int Guass(){
int i,j,k,col;
CL(x,0);CL(free_x,1);//清空解集 for(k=0,col=0;k<equ && col<var ;k++,col++){//枚举行和列
// cout<<k<<" "<<col<<endl;
int max_r = k;
for(i=k+1;i<equ;i++)
if(iabs(a[i][col]) > iabs(a[max_r][col])) max_r = i;
if(max_r != k)//交换
for(i=k;i<var+1;i++)
swap(a[k][i],a[max_r][i]); if( zero(a[k][col]) ) {
k--; //为什么有k--;模拟下这样可以减的多点
continue;
} for(i=k+1;i<equ;i++){
if(!zero(a[i][col])){
// int lcm = LCM(a[k][col],a[i][col]);
// int ta = lcm/iabs(a[i][col]);
// int tb = lcm/iabs(a[k][col]);
// 如果读入的矩阵是整数可按照上面的写,否则得按照下面的写
double tb = iabs(a[i][col])/iabs(a[k][col]);
if(a[i][col]*a[k][col]<0) tb=-tb;
for(j=col;j<var+1;j++)
a[i][j] = a[i][j] - tb*a[k][j];
}
}
}
// Debug();
//1.无解的情况出现(0,0,0,0,……a)这样的行且a!=0
for(i=k;i<equ;i++){
if(!zero(a[i][col]))
{
printf("Impossible !\n");
return -1;
}
}
//2.无穷解的情况,再var*(var+1)的增广矩阵中出现(0,0,0……0)这样的行
//出现的行数便是自由变元的个数
if(k<var){
int num = 0,freeidx=0;
for(i=k-1;i>=0;i--){
num=0;
//用于判断该行的不确定的变元的个数,如果超过1则无法求解
//它们仍然为不确定的变元
double tmp = a[i][var];
for(j=0;j<var;j++)
if(!zero(a[i][j]) && free_x[j]){
num++;
freeidx = j;
}
if(num>1) continue;
tmp=a[i][var];
for(j=0;j<var;j++){
if(!zero(a[i][j]) && j != freeidx) tmp -= a[i][j]*x[j];
}
x[freeidx] = tmp/a[i][freeidx];
free_x[freeidx]=0;
}
if(free_x[0] == 0) printf("%.2lf\n",x[0]);
else printf("Impossible !\n");
return var-k;
}
//3.唯一解的情况
for(i=k-1;i>=0;i--)
{
double tmp=a[i][var]*1.0;
for(j=i+1;j<var;j++)
tmp-=a[i][j]*x[j];
x[i] = tmp/(a[i][i]*1.0);
}
printf("%.2lf\n",x[0]);
return 0;
} double g[N];
int tg[N];
int mark[N][2];
int id = 0;
int n,m;
double savevar[N];
int flagflag; //感觉这里面可以直接建立方程
void dfs(int p,int d,int y)
{
int td = d;
mark[p][d] = id++;
int tp = p;
a[ mark[p][d] ][ mark[p][d] ] = -1;
double tmp = 0;
for(int i=1;i<=m;i++)
{
if(d==0) tp++;
else tp--; if(tp == 0) d = 0;
else if(tp==n-1) d=1; if(tg[i]==0) continue; tmp += i*g[i]; if(tp==y) {flagflag=1;continue;} if(mark[tp][d]==-1)
dfs(tp,d,y); a[ mark[p][td] ][ mark[tp][d] ] += g[i];//这里确实有点问题
}
savevar[ mark[p][td] ] = tmp;
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
flagflag = 0;
int y,p,d;
cin>>n>>m>>y>>p>>d;
memset(savevar,0,sizeof(savevar));//真是神奇的错误啊
for(int i=1;i<=m;i++)
{
int tmp;
scanf("%d",&tmp);
tg[i] = tmp;
g[i] = (double)tmp/100;
}
if(y==p)
{
printf("0.00\n");
continue;
}
memset(mark,-1,sizeof(mark));
// if(d==-1)
// {
// if(p==0) d = 0;
// else d = 1;
// }
if(p==0) d=0;
else if(p==n-1) d=1;
id = 0;
memset(a,0,sizeof(a));
dfs(p,d,y);
// if(flagflag == 0)
// {
// printf("Impossible !\n");
// continue;
// }
for(int i=0;i<id;i++)//有id个等式
{
a[i][id] = -savevar[i];
}
equ = var = id;
// for(i=0;i<equ;i++)
// for(j=0;j<var+1;j++){
// scanf("%lf",&a[i][j]);
// }
//Debug();
//cout<<endl;
int free_num=Guass();
// co++;
// printf("Case #%d:",co);
// if(free_num==0)
// {
// printf("%.2lf",(iabs(x[0])<EPS?EPS:x[0]));
// for(int i=1;i<var;i++) printf(" %.2lf",(iabs(x[i])<EPS?EPS:x[i]));
// cout<<endl;
// }else cout<<"Can't solve it."<<endl;
//无求无穷多解的情况
}
return 0;
} /*
100
4 2 0 1 0
0 100
4 10 0 1 0
10 10 5 5 0 20 20 20 2 8
10 5 5 0 -1
10 20 30 20 20
10 100 5 9 -1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
10 4 1 2 0
0 20 0 80
100 4 1 2 0
0 20 0 80
100 100 5 9 0
1 1 1 1 1 1 1 1 1 1 0 1 1 0 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
100 4 1 2 0
0 20 1 79
*/

  

hdu4418(概率dp + 高斯消元)的更多相关文章

  1. BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元

    BZOJ_1778_[Usaco2010 Hol]Dotp 驱逐猪猡_概率DP+高斯消元 题意: 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 3 ...

  2. LightOJ - 1151概率dp+高斯消元

    概率dp+高斯消元 https://vjudge.net/problem/LightOJ-1151 题意:刚开始在1,要走到100,每次走的距离1-6,超过100重来,有一些点可能有传送点,可以传送到 ...

  3. 【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

    题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两 ...

  4. BZOJ3270 博物館 概率DP 高斯消元

    BZOJ3270 博物館 概率DP 高斯消元 @(XSY)[概率DP, 高斯消元] Description 有一天Petya和他的朋友Vasya在进行他们众多旅行中的一次旅行,他们决定去参观一座城堡博 ...

  5. BZOJ 3270: 博物馆 [概率DP 高斯消元]

    http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...

  6. 【BZOJ3640】JC的小苹果 概率DP+高斯消元

    [BZOJ3640]JC的小苹果 Description 让我们继续JC和DZY的故事. “你是我的小丫小苹果,怎么爱你都不嫌多!” “点亮我生命的火,火火火火火!” 话说JC历经艰辛来到了城市B,但 ...

  7. HDU-4418 Time travel 概率DP,高斯消元

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4418 题意:简单来说就是给你1个环(n - 1 , n - 2 …… 0 ,1 , 2 , 3 …… ...

  8. 【概率DP/高斯消元】BZOJ 2337:[HNOI2011]XOR和路径

    2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 682  Solved: 384[Submit][Stat ...

  9. BZOJ 3640: JC的小苹果 [概率DP 高斯消元 矩阵求逆]

    3640: JC的小苹果 题意:求1到n点权和\(\le k\)的概率 sengxian orz的题解好详细啊 容易想到\(f[i][j]\)表示走到i点权为j的概率 按点权分层,可以DP 但是对于\ ...

  10. LightOJ 1151 Snakes and Ladders(概率DP + 高斯消元)

    题意:1~100的格子,有n个传送阵,一个把进入i的人瞬间传送到tp[i](可能传送到前面,也可能是后面),已知传送阵终点不会有另一个传送阵,1和100都不会有传送阵.每次走都需要掷一次骰子(1~6且 ...

随机推荐

  1. NOIP 营业额统计 splay tree 纯模板

    2924: 营业额统计 Time Limit(Common/Java):1000MS/3000MS     Memory Limit:65536KByteTotal Submit: 389       ...

  2. 2016年10月14日 星期五 --出埃及记 Exodus 18:25

    2016年10月14日 星期五 --出埃及记 Exodus 18:25 He chose capable men from all Israel and made them leaders of th ...

  3. 进程间通信之打开关闭一个exe文件

    一.打开 1.WinExec("F:\\QQ\\Bin\\QQ.exe",SW_SHOW); 注意:'\'需要改成'\\',阻塞 2. STARTUPINFO si; PROCES ...

  4. iOS中3种正则表达式的使用与比较

    正则表达式在用户注册和登录中应用很广,通过正则表达式可以判断用户输入的数据正确与否. 在iOS4.0以前开发者一般是通过谓词(NSPredicate)和加入正则表达式的第三方库(如:RegexKitL ...

  5. FZU 2147 A-B Game

    A-B Game Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Sta ...

  6. Devexpress TreeList选择父级联动

    Treelist当显示复选框后,父级和子级的复选框没有关联,使用过程中很不便,如图所示 自己给treelist添加父子级联动 /// <summary> /// 初始化TreeList,父 ...

  7. .bash_profile和.bashrc的区别,ubuntu下为.profile,没有.bash_profile

    .bash_profile 开机自动加载,比如java的环境变量放在里面 .bashrc打开shell或终端就会加载该文件,比如起的别名或快捷方式放里面.alias设置就在其中. 还有一个.profi ...

  8. libreoffice实现WORD文档转PDF文档

    一.安装LibreOffice 官网:http://www.libreoffice.org/ 二.CentOS安装yum yum install libreoffice 三.执行转换命令 libreo ...

  9. Codeforces Round #237 (Div. 2) A

    链接:http://codeforces.com/contest/404/problem/A A. Valera and X time limit per test 1 second memory l ...

  10. FJNU 1156 Fat Brother’s Gorehowl(胖哥的血吼)

    FJNU 1156 Fat Brother’s Gorehowl(胖哥的血吼) Time Limit: 1000MS   Memory Limit: 257792K [Description] [题目 ...