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,如果她每次做题都用两个账号中分数低的 ...
随机推荐
- 【第七篇】bootstrap的3级菜单样式,支持母版页保留打开状态
razor视图的,母版页 依旧不多说,直接上代码 <ul class="sidebar-menu"> @for (int i = 0; i < mList.Cou ...
- sound tips
ASaudio&SoundAS 两个开源项目阅读: ASaudio&SoundAS 都是比较小巧的声音控制,但似乎都不能直接拿到项目只直接使用. ASaudio ASaudio的Tra ...
- Heritrix源码分析(三) 修改配置文件order.xml加快你的抓取速度(转)
本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/629891 本博客已迁移到本人独立博客: http://www.yun5u ...
- switchover步骤切换
主库 alter system switch logfile; alter system set log_archive_dest_state_2='defer'; select switchover ...
- [转]Linux read用法
来源:http://www.cnblogs.com/iloveyoucc/archive/2012/04/16/2451328.html 1.基本读取 read命令接收标准输入(键盘)的输入,或其他文 ...
- 页面异步加载javascript文件
昨天听一同事说的异步加载js文件,可以提高页面加载速度.具体方法如下:(function() { var ga = document.createElement('script'); ga.type ...
- Android学习随笔--ListView的分页功能
第一次写博客,可能格式,排版什么的会非常不美观,不过我主要是为了记录自己的Android学习之路,为了以后能有些东西回顾.既然是为了学习,那我肯定会吸收各位大大们的知道经验,有不足的地方请指出. 通过 ...
- 15、NFC技术:使用Android Beam技术传输文件
传输文件的API 从Android4.1开始,NfcAdapter类增加了如下两个推送数据的方法. NfcAdapter.setBeamPushUris NfcAdapter.setBeamPushU ...
- Golang 绘图技术(image/draw包介绍)
image/draw 包仅仅定义了一个操作:通过可选的蒙版图(mask image),把一个原始图片绘制到目标图片上,这个操作是出奇的灵活,可以优雅和高效的执行很多常见的图像处理任务. 1 ...
- 【剑指offer 面试题27】二叉搜索树与双向链表
输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表. C++: #include <iostream> using namespace std; struct TreeNode { ...