HDU 4870   Rating

这是前几天多校的题目,高了好久突然听旁边的大神推出来说是可以用高斯消元,一直喊着赶快敲模板,对于从来没有接触过高斯消元的我来说根本就是一头雾水,无赖之下这几天做DP,正好又做到了这个题,没办法得从头开始看,后来在网上找了别人的高斯消元的模板后发现其实也还是很好理解,就是先构造一个增广矩阵,然后化行阶梯形,最后迭代求解

首先有一个介绍高斯消元感觉过于详细的博客http://blog.csdn.net/tsaid/article/details/7329301

首先看一下这个题怎么构造这个增广矩阵,我们把所有可以达到的分数组合作为一个点,再考虑它与其他点所连的边,例如:

(300, 200)<--(1-p)----(300, 300)-----(p)----->(350, 300)

a                               b                                    c

我们就可以理解为有一条b--->a的权值为(1-p)的边,有一条b---->c的权值为p的边,那这样首先构造状态转移方程:

DP[b] = 1 + (1-p) * DP[a] + p * DP[c]

变形后得到:

DP[b] - p * DP[c] - (1-p) * DP[a] = 1;

这就是我们的增广矩阵的系数了,对于方程的一般形式Ax = B,可以理解为第b个方程中的变元的系数为A[b][b] = 1, A[b][c] = p, A[b][a] = (1-p),B[b] = 1

这样就构造出了一个(A,B)的一个增广矩阵,保存在a中

然后就是高斯消元化行阶梯行,看看代码很好理解,就只有两个操作r1<-->r2,交换两行,r2 = r2 - r1 * a   (其中a为一个常系数)

第一次写Gauss 代码比较戳,可以根据网上详细的介绍结合代码看,很容易懂的

void gauss()
{int col = 0;for(int k=0;k<cnt && col < cnt;k++, col ++){double Max = fabs(a[k][col]);int  Maxr = k;for(int r = k + 1; r < cnt; r ++)if( fabs(a[r][col])  -  Max  >  eps  )Max  =  fabs( a[Maxr = r][col] );if(fabs(Max) < eps)  {  k --;  continue;  }for(int c = col;c<=cnt; c ++ )SWAP(a[Maxr][c],  a[k][c]  );for(int r = k + 1; r < cnt; r ++ ) if( fabs(a[r][col]) > eps  ){double tmp = a[r][col] / a[k][col];for(int c = col; c <= cnt; c ++ )a[r][c] -= tmp * a[k][c];}}
}

化行阶梯行后就是迭代求解了,由于这里一定有解,所以不需要判断无解的情况,直接算就是了

1        for(int r=cnt-1;r>=0;r--)
2         {
3                     for(int c = cnt-1;c>r;c--)
4                             a[r][cnt] -= a[r][c] * ans[c];
5                     ans[r] = a[r][cnt] / a[r][r];
6         }

最后的总复杂度就是O(n^3)n接近200

另外还有一个复杂度O(n)的解法的思路(N=20)http://www.cnblogs.com/gj-Acit/p/3888390.html

  1 #include <map>
  2 #include <set>
  3 #include <stack>
  4 #include <queue>
  5 #include <cmath>
  6 #include <ctime>
  7 #include <vector>
  8 #include <cstdio>
  9 #include <cctype>
 10 #include <cstring>
 11 #include <cstdlib>
 12 #include <iostream>
 13 #include <algorithm>
 14 using namespace std;
 15 #define INF ((LL)100000000000000000)
 16 #define inf (-((LL)1<<40))
 17 #define lson k<<1, L, mid
 18 #define rson k<<1|1, mid+1, R
 19 #define mem0(a) memset(a,0,sizeof(a))
 20 #define mem1(a) memset(a,-1,sizeof(a))
 21 #define mem(a, b) memset(a, b, sizeof(a))
 22 #define FOPENIN(IN) freopen(IN, "r", stdin)
 23 #define FOPENOUT(OUT) freopen(OUT, "w", stdout)
 24 template<class T> T CMP_MIN ( T a, T b ) { return a < b;   }
 25 template<class T> T CMP_MAX ( T a, T b ) { return a > b;   }
 26 template<class T> T MAX ( T a, T b ) { return a > b ? a : b; }
 27 template<class T> T MIN ( T a, T b ) { return a < b ? a : b; }
 28 template<class T> T GCD ( T a, T b ) { return b ? GCD ( b, a % b ) : a; }
 29 template<class T> T LCM ( T a, T b ) { return a / GCD ( a, b ) * b;       }
 30 template<class T> void SWAP( T& a, T& b ) { T t = a; a = b;  b = t; }
 31
 32 //typedef __int64 LL;
 33 typedef long long LL;
 34 const int MAXN = 255;
 35 const int MAXM = 110000;
 36 const double eps = 1e-12;
 37 int dx[4] = { -1, 0, 0, 1};
 38 int dy[4] = {0, -1, 1, 0};
 39
 40 double p;
 41 int  id[30][30], cnt, N = 20;
 42 double G[400][400], a[300][300], ans[300];
 43 struct NODE
 44 {
 45         int u, d;
 46         NODE(){}
 47         NODE(int _u, int _d):u(_u), d(_d){}
 48 };
 49
 50 void preInit()
 51 {
 52         cnt = 0;
 53         for(int i=0;i<=N-1;i++)
 54         {
 55                 for(int j = 0; j <= i; j ++ )
 56                 {
 57                         id[i][j] = cnt++;
 58                 }
 59         }
 60         id[N][N-1] = cnt ++;
 61 }
 62
 63 void init()
 64 {
 65         preInit();
 66         mem0(G);mem0(a);
 67         for(int i=0;i<=N-1;i++)
 68         {
 69                 for(int j=0;j<=i;j++)
 70                 {
 71                         int nx = MAX(i, j + 1), ny = MIN(i, j + 1);
 72                         G[id[i][j]][id[nx][ny]] = p;
 73                         nx = i; ny = (j- 2) >= 0 ? j-2 : 0;
 74                         G[id[i][j]][id[nx][ny]] = 1-p;
 75                 }
 76         }
 77         for ( int i = 0; i < cnt; i++ )
 78         {
 79                 a[i][i] = a[i][cnt] = 1.0;
 80                 if ( i == cnt-1 ) { a[i][cnt] = 0; }
 81                 for ( int j = 0; j < cnt; j++ ) if ( fabs ( G[i][j] ) > eps )
 82                             a[i][j] -= G[i][j];
 83         }
 84 }
 85
 86
 87 void gauss()
 88 {
 89         int col = 0;
 90         for(int k=0;k<cnt && col < cnt;k++, col ++)
 91         {
 92                     double Max = fabs(a[k][col]);
 93                     int  Maxr = k;
 94                     for(int r = k + 1; r < cnt; r ++)
 95                             if( fabs(a[r][col])  -  Max  >  eps  )
 96                                     Max  =  fabs( a[Maxr = r][col] );
 97                     if(fabs(Max) < eps)  {  k --;  continue;  }
 98                     for(int c = col;c<=cnt; c ++ )
 99                             SWAP(a[Maxr][c],  a[k][c]  );
100                     for(int r = k + 1; r < cnt; r ++ ) if( fabs(a[r][col]) > eps  )
101                     {
102                             double tmp = a[r][col] / a[k][col];
103                             for(int c = col; c <= cnt; c ++ )
104                                     a[r][c] -= tmp * a[k][c];
105                     }
106         }
107         for(int r=cnt-1;r>=0;r--)
108         {
109                     for(int c = cnt-1;c>r;c--)
110                             a[r][cnt] -= a[r][c] * ans[c];
111                     ans[r] = a[r][cnt] / a[r][r];
112         }
113 }
114
115 int main()
116 {
117 //        FOPENIN ( "in.txt" );
118 //       FOPENOUT("out.txt");
119         while ( ~scanf ( "%lf", &p ) )
120         {
121                 init();
122                gauss();
123                 printf("%.9lf\n", ans[0]);
124         }
125         return 0;
126 }

转载于:https://www.cnblogs.com/gj-Acit/p/3888382.html

HDU 4870 Rating(高斯消元 )相关推荐

  1. HDU 4305 Lightning (高斯消元解kirchhoff矩阵+逆元)

    题意是:给一些坐标点,如果两点之间的距离小于R,并且两点之间没有其他点,则这两个点保持连通,这样构成了一个图.问这个图中生成树的个数. 因为数据量并不大,O(N^3)的建图没有问题. 建好图以后就可以 ...

  2. HDU4870 Rating(高斯消元)

    有个人有两个0分账号,他可以打比赛,他每次用分低的那个账号打比赛, 有p的概率名列前茅,加50分(上限1000分) 否则掉100分(下限0分).问有一个账号到1000分的期望. 先压缩一下状态,把50 ...

  3. HDU - 3364 Lanterns(高斯消元解方程(取模))

    题目链接:点击查看 题目大意:给出 n 盏灯和 m 个开关,每个开关可以控制多个灯,每次询问给定灯的最终状态,问有多少种方案可以到达 题目分析:以开关为变元,灯为方程列出方程组,每次求出有多少个自由元 ...

  4. HDU 3364 Lanterns 高斯消元(水 异或方程

    题目链接:点击打开链接 题意: 给定n盏灯,m个开关 下面m行给出每个开关可以控制哪些灯(即按下此开关,这些灯的状态会改变) 下面q个询问:一行一个询问,一个询问n个数字表示灯的最终状态 问从全暗到这 ...

  5. HDU 3359 高斯消元模板题,

    http://acm.hdu.edu.cn/showproblem.php?pid=3359 题目的意思是,由矩阵A生成矩阵B的方法是: 以a[i][j]为中心的,哈曼顿距离不大于dis的数字的总和 ...

  6. 【HDU 5755】Gambler Bo(高斯消元)

    [HDU 5755]Gambler Bo(高斯消元) Gambler Bo Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072 ...

  7. [HDU 5755] Gambler Bo (高斯消元)

    HDU - 5755 给定一个 N×MN \times M的矩阵,每个格子都有一个数, 并且这些数都是 mod 3mod\ 3的 每次选一个格子操作,可以在这个格子加 2 mod 32\ mod\ 3 ...

  8. AC自动机 + 概率dp + 高斯消元 --- HDU 5955 or 2016年沈阳icpc H [AC自动机 + 概率dp + 高斯消元]详解

    题目链接 题目大意: 就是有NNN个人,每个人都会猜一个长度为LLL的只包含{1,2,3,4,5,6}\{1,2,3,4,5,6\}{1,2,3,4,5,6}的序列,现在裁判开始投掷骰子,并且把每次的 ...

  9. 【高斯消元】[HDU 3359][POJ3999][UVALive4741]Kind of a Blur

    题目 题意很简单: 根据d列出一个n*m元一次方程组即可,高斯消元模板题. #include<cstdio> #include<cmath> #include<cstri ...

最新文章

  1. Mongodb python驱动教程
  2. Docker(一):Docker入门教程
  3. ftp软件哪个好用_和平精英录屏软件哪个好用 和平精英录屏软件介绍
  4. IDEA添加eclispe的项目,需要把对应的文件夹设置成对应的资源
  5. 【数据结构与算法】字符串匹配 AC自动机
  6. mysql连网安装和断网安装的区别_linux连网和jdk环境配置以及mysql安装
  7. 二叉树的公共祖先(递归)
  8. 织梦head.html,DeDe织梦cms主要模板head区域常用调用标签
  9. 2020最新Java高级工程师学习路线
  10. php字游戏源码,php文字游戏寻仙纪.zip
  11. 免费开源Blazor在线Ico转换工具
  12. wi7计算机桌面删除,如何删除win7系统桌面IE图标|win7删除桌面IE图标的方法
  13. 山地车的结构及骑行注意事项
  14. rpg学院 unity_Unity3d - RPG项目学习笔记(一)
  15. java Complex 类
  16. dns劫持如何完美修复?dns被劫持如何解决如何完美修复
  17. MLAPP————第五章 贝叶斯统计
  18. 【mcuclub】蓝牙模块-ECB02
  19. 数学之美:数学究竟是如何深入我们的生活
  20. 树莓派 Pico (1):关于 Device is busy or does not respond 解决方法

热门文章

  1. linux性能评估-内存基础理解篇
  2. SQL Server 2017 AlwaysOn AG 自动初始化(七)
  3. 保障金融无线网络安全从“头”开始
  4. SOA面向服务架构——SOA的概念
  5. ecshop二次开发 给商品添加自定义字段【包含我自己进一步的开发实例详解】
  6. 可以上传视频的网站大全
  7. Mysql:日志管理:错误日志
  8. 关于Python你必须知道的常识
  9. hbase查看表结构_HBase 常用 Shell 命令手册
  10. 删除按钮_SPA PP COGI中禁用删除按钮?