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,如果她每次做题都用两个账号中分数低的 ...
 
随机推荐
- php的session_start
			
如果session使用cookie记录,那么在session_start时会设置一个cookie,参数取决于php.ini的设置,当然也可以通过session_set_param在程序里设置.不同站点 ...
 - 聊聊Oracle 11g的Snapshot Standby Database(上)
			
Oracle 11g是Data Guard的重要里程碑版本.在11g中,Active DataGuard.Advanced Compression等特性大大丰富了Data Guard的功能和在实践领域 ...
 - hive部署手册
			
安装环境: 机器 只需要安装一台机器 操作系统:Ubuntu 11.04 64操作系统 hadoop:版本是1.0.2,安装在/usr/local/hadoop sun ...
 - 正确理解 AsyncTask,Looper,Handler三者之间的关系(基于android 4.0)
			
Looper 和Handler 是理解好AsyncTask的一个基础,我们可以先从这里开始,先给出一个主线程和子线程互相通信的例子. package com.example.loopertest; i ...
 - NodeJS模块
			
node> module { id: 'repl', exports: { writer: { [Function: inspect] colors: [Object], styles: [Ob ...
 - appdata文件夹有什么用途?C盘appdata可以删除吗?
			
在内存紧张的时候,我们都会选择删除一些无关紧要的大文件来释放内存,有不少网友发现在系统C盘下有一个appdata文件夹,而且体积挺大的,不知道能不能删除,针对此问题,本文就为大家介绍appdata文件 ...
 - shell 中数学计算总结
			
shell中的赋值和操作默认都是字符串处理,在此记下shell中进行数学运算的几个特殊方法,以后用到的时候可以来看,呵呵. 1.错误方法举例 a) var=1+1 echo $var ...
 - 0bjective-c 之 NSString 使用详解
			
查找资料的时候发现不错的文章,自己翻译之后分享给大家! 一个基本的该类型字符串例子: @"This is a constant character string object"; ...
 - swfupload 参数说明
			
一.配置参数对象中的常用属性及说明 属性 类型 默认值 描述 upload_url String 处理上传文件的服务器端页面的url地址,可以是绝对地址,也可以是相对地址,当为相对地址时相对的是当 ...
 - JVM 性能调优实战之:一次系统性能瓶颈的寻找过程
			
玩过性能优化的朋友都清楚,性能优化的关键并不在于怎么进行优化,而在于怎么找到当前系统的性能瓶颈.性能优化分为好几个层次,比如系统层次.算法层次.代码层次…JVM 的性能优化被认为是底层优化,门槛较高, ...