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 = ;
for(int k=;k<cnt && col < cnt;k++, col ++)
{
double Max = fabs(a[k][col]);
int Maxr = k;
for(int r = k + ; 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 + ; 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];
}
}
}
化行阶梯行后就是迭代求解了,由于这里一定有解,所以不需要判断无解的情况,直接算就是了
for(int r=cnt-;r>=;r--)
{
for(int c = cnt-;c>r;c--)
a[r][cnt] -= a[r][c] * ans[c];
ans[r] = a[r][cnt] / a[r][r];
}
最后的总复杂度就是O(n^3)n接近200
另外还有一个复杂度O(n)的解法的思路(N=20)http://www.cnblogs.com/gj-Acit/p/3888390.html
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <cmath>
#include <ctime>
#include <vector>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define INF ((LL)100000000000000000)
#define inf (-((LL)1<<40))
#define lson k<<1, L, mid
#define rson k<<1|1, mid+1, R
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define mem(a, b) memset(a, b, sizeof(a))
#define FOPENIN(IN) freopen(IN, "r", stdin)
#define FOPENOUT(OUT) freopen(OUT, "w", stdout)
template<class T> T CMP_MIN ( T a, T b ) { return a < b; }
template<class T> T CMP_MAX ( T a, T b ) { return a > b; }
template<class T> T MAX ( T a, T b ) { return a > b ? a : b; }
template<class T> T MIN ( T a, T b ) { return a < b ? a : b; }
template<class T> T GCD ( T a, T b ) { return b ? GCD ( b, a % b ) : a; }
template<class T> T LCM ( T a, T b ) { return a / GCD ( a, b ) * b; }
template<class T> void SWAP( T& a, T& b ) { T t = a; a = b; b = t; } //typedef __int64 LL;
typedef long long LL;
const int MAXN = ;
const int MAXM = ;
const double eps = 1e-;
int dx[] = { -, , , };
int dy[] = {, -, , }; double p;
int id[][], cnt, N = ;
double G[][], a[][], ans[];
struct NODE
{
int u, d;
NODE(){}
NODE(int _u, int _d):u(_u), d(_d){}
}; void preInit()
{
cnt = ;
for(int i=;i<=N-;i++)
{
for(int j = ; j <= i; j ++ )
{
id[i][j] = cnt++;
}
}
id[N][N-] = cnt ++;
} void init()
{
preInit();
mem0(G);mem0(a);
for(int i=;i<=N-;i++)
{
for(int j=;j<=i;j++)
{
int nx = MAX(i, j + ), ny = MIN(i, j + );
G[id[i][j]][id[nx][ny]] = p;
nx = i; ny = (j- ) >= ? j- : ;
G[id[i][j]][id[nx][ny]] = -p;
}
}
for ( int i = ; i < cnt; i++ )
{
a[i][i] = a[i][cnt] = 1.0;
if ( i == cnt- ) { a[i][cnt] = ; }
for ( int j = ; j < cnt; j++ ) if ( fabs ( G[i][j] ) > eps )
a[i][j] -= G[i][j];
}
} void gauss()
{
int col = ;
for(int k=;k<cnt && col < cnt;k++, col ++)
{
double Max = fabs(a[k][col]);
int Maxr = k;
for(int r = k + ; 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 + ; 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];
}
}
for(int r=cnt-;r>=;r--)
{
for(int c = cnt-;c>r;c--)
a[r][cnt] -= a[r][c] * ans[c];
ans[r] = a[r][cnt] / a[r][r];
}
} int main()
{
// FOPENIN ( "in.txt" );
// FOPENOUT("out.txt");
while ( ~scanf ( "%lf", &p ) )
{
init();
gauss();
printf("%.9lf\n", ans[]);
}
return ;
}
HDU 4870 Rating(高斯消元 )的更多相关文章
- hdu 4870 rating(高斯消元求期望)
Rating Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU 3949 XOR 高斯消元
题目大意:给定一个数组,求这些数组通过异或能得到的数中的第k小是多少 首先高斯消元求出线性基,然后将k依照二进制拆分就可以 注意当高斯消元结束后若末尾有0则第1小是0 特判一下然后k-- 然后HDU输 ...
- hdu 5755(高斯消元——模线性方程组模板)
PS. 看了大神的题解,发现确实可以用m个未知数的高斯消元做.因为确定了第一行的情况,之后所有行的情况都可以根据第一行推. 这样复杂度直接变成O(m*m*m) 知道了是高斯消元后,其实只要稍加处理,就 ...
- HDU 3949 XOR [高斯消元XOR 线性基]
3949冰上走 题意: 给你 N个数,从中取出若干个进行异或运算 , 求最后所有可以得到的异或结果中的第k小值 N个数高斯消元求出线性基后,设秩为$r$,那么总共可以组成$2^r$中数字(本题不能不选 ...
- Time travel HDU - 4418(高斯消元)
Agent K is one of the greatest agents in a secret organization called Men in Black. Once he needs to ...
- hdu 6465 线性变换高斯消元
http://acm.hdu.edu.cn/showproblem.php?pid=6465 题意 给你三个点,再给你经过线性变换后的三个点,然后q次询问,给你一个点,需要你输出线性变换后的点 题解 ...
- HDU 3364 Lanterns 高斯消元
Lanterns Problem Description Alice has received a beautiful present from Bob. The present contains ...
- HDU 3915 Game (高斯消元)
题意:有n堆石子,每个人只能从某一堆至少拿走一个,不能拿者败.问事先拿走某些堆的石子,使得先手必败. 析:将石子拆成二进制,未知数为1表示保留该堆石子,为0表示事先拿走该堆石子.最后求自由变元的数目, ...
- 2014多校第一场J题 || HDU 4870 Rating(DP || 高斯消元)
题目链接 题意 :小女孩注册了两个比赛的帐号,初始分值都为0,每做一次比赛如果排名在前两百名,rating涨50,否则降100,告诉你她每次比赛在前两百名的概率p,如果她每次做题都用两个账号中分数低的 ...
随机推荐
- hdu 4619 Warm up 2 网络流 最小割
题意:告诉你一些骨牌,然后骨牌的位置与横竖,这样求最多保留多少无覆盖的方格. 这样的话有人用二分匹配,因为两个必定去掉一个,我用的是最小割,因为保证横着和竖着不连通即可. #include <s ...
- mysql 存储过程 事务; mysql的事务中包含一个存储过程
在asp.net结合mysql的开发中,我平时用到的事务处理是 使用 TransactionOptions 来进行处理 TransactionOptions transactionOption = ...
- Android Studio 学习 - HelloWorld
今天是学习Android Studio的第2天,加油! 1. 首先要记录下使用Android Studio的一个代码自动完成的功能.平常基本上用Delphi,乍一换工具,各种不习惯,或者说不熟悉.按照 ...
- log4net使用介绍
log4net是一款开源的日志工具,现已挂在apache基金会下.非常简单灵活,初学者有时会发现log4参照资料配置好,但并不输出日志.这种情况,一般是没有准确定位到配置文件.可参阅第3步. 下载 下 ...
- Android源码分析--CircleImageView 源码详解
源码地址为 https://github.com/hdodenhof/CircleImageView 实际上就是一个圆形的imageview 的自定义控件.代码写的很优雅,实现效果也很好, 特此分析. ...
- RESTful HTTP的实践
REST是一种风格,而不是标准.因为既没有REST RFC,也没有REST协议规范或者类似的规定.REST架构是Roy Fielding(他也是HTTP和URI规范的主要作者之一)在一篇论文中描述的. ...
- rand.Read() 和 io.ReadFull(rand.Reader) 的区别?
golang的随机包 rand.go 中我们可以看到 rand.Read 其实是调用的io.Reader.Read() 1: // Package rand implements a cryptogr ...
- 【,net】发布网站问题
今天解决了一个发布后网站访问不了的问题: 问题: 发布网站:http://172.168.1.102:2222/nologin.html,但是页面一直处于刷新状态,进行不了系统: 解决方法: 问开发他 ...
- JS操作文件
) ; ; fso ); f1.Close(); // 读取文件的内容. // Response.Write("Reading file <br>") ...
- 关于Activity的少许细节
1. 对活动应用样式和主题 2. 隐藏活动标题 3. 显示对话框窗口 4. 显示进度对话框 1. 应用样式和主题 改成 android:theme="@android:style/Th ...