HDU-2262 Where is the canteen 概率DP,高斯消元
2013-08-11 17:15
281 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2262
题意:LL在一个迷宫里面转,每次走向周围能走的点的概率都是一样的,现在LL要随机的走到canteen哪里,求期望。
这个是带环的求期望问题,并且没有什么特殊性,只有列出方程,然后gauss消元了。首先用BFS求出能走的点,并判断能否走到canteen。然后列出期望方程,E[i]=Σ( E[j]*p[j] ) +1。然后好求了,注意题目中有多个canteen。。。
题意:LL在一个迷宫里面转,每次走向周围能走的点的概率都是一样的,现在LL要随机的走到canteen哪里,求期望。
这个是带环的求期望问题,并且没有什么特殊性,只有列出方程,然后gauss消元了。首先用BFS求出能走的点,并判断能否走到canteen。然后列出期望方程,E[i]=Σ( E[j]*p[j] ) +1。然后好求了,注意题目中有多个canteen。。。
//STATUS:C++_AC_437MS_700KB #include <functional> #include <algorithm> #include <iostream> //#include <ext/rope> #include <fstream> #include <sstream> #include <iomanip> #include <numeric> #include <cstring> #include <cassert> #include <cstdio> #include <string> #include <vector> #include <bitset> #include <queue> #include <stack> #include <cmath> #include <ctime> #include <list> #include <set> #include <map> using namespace std; //#pragma comment(linker,"/STACK:102400000,102400000") //using namespace __gnu_cxx; //define #define pii pair<int,int> #define mem(a,b) memset(a,b,sizeof(a)) #define lson l,mid,rt<<1 #define rson mid+1,r,rt<<1|1 #define PI acos(-1.0) //typedef typedef __int64 LL; typedef unsigned __int64 ULL; //const const int N=230; const int INF=0x3f3f3f3f; const LL MOD=1000000007,STA=8000010; const LL LNF=1LL<<55; const double EPS=1e-9; const double OO=1e30; const int dx[4]={-1,0,1,0}; const int dy[4]={0,1,0,-1}; const int day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; //Daily Use ... inline int sign(double x){return (x>EPS)-(x<-EPS);} 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> inline T lcm(T a,T b,T d){return a/d*b;} template<class T> inline T Min(T a,T b){return a<b?a:b;} template<class T> inline T Max(T a,T b){return a>b?a:b;} template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);} template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);} template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));} template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));} //End /* gauss_elimination O(n^3) n个方程n个变元 要求系数矩阵可逆 A[][]是增广矩阵,即A[i] 是第i个方程右边的常数bi 运行结束后A[i] 是第i个未知数的值 */ int vis[20][20],cnt[20][20],e[20][20]; char g[20][20]; int n,m,tot,sx,sy; double A ; int gauss(int n) { int i,j,k,r; for(i=0;i<n;i++){ //选一行与r与第i行交换,提高数据值的稳定性 r=i; for(j=i+1;j<n;j++) if(fabs(A[j][i]) > fabs(A[r][i]))r=j; if(r!=i)for(j=0;j<=n;j++)swap(A[r][j],A[i][j]); //i行与i+1~n行消元 /* for(k=i+1;k<n;k++){ //从小到大消元,中间变量f会有损失 double f=A[k][i]/A[i][i]; for(j=i;j<=n;j++)A[k][j]-=f*A[i][j]; }*/ for(j=n;j>=i;j--){ //从大到小消元,精度更高 for(k=i+1;k<n;k++) A[k][j]-=A[k][i]/A[i][i]*A[i][j]; } } //判断方程时候有解 for(i=0;i<n;i++)if(sign(A[i][i])==0)return 0; //回代过程 for(i=n-1;i>=0;i--){ for(j=i+1;j<n;j++) A[i] -=A[j] *A[i][j]; A[i] /=A[i][i]; } return 1; } int bfs() { int i,j,x,y,nx,ny,t; queue<int> q; q.push(sx*m+sy); mem(vis,-1);mem(cnt,0); vis[sx][sy]=tot=0; tot++; while(!q.empty()){ t=q.front();q.pop(); x=t/m;y=t%m; for(i=0;i<4;i++){ nx=x+dx[i]; ny=y+dy[i]; if(nx>=0&&nx<n && ny>=0&&ny<m && g[nx][ny]!='#'){ cnt[x][y]++; if(vis[nx][ny]!=-1)continue; vis[nx][ny]=tot++; q.push(nx*m+ny); } } } for(i=0;i<n;i++){ for(j=0;j<m;j++) if(vis[i][j]!=-1 && e[i][j])return 1; } return 0; } int main(){ // freopen("in.txt","r",stdin); int i,j,k; while(~scanf("%d%d",&n,&m)) { mem(e,0); for(i=0;i<n;i++){ scanf("%s",g[i]); for(j=0;j<m;j++){ if(g[i][j]=='@')sx=i,sy=j; else if(g[i][j]=='$')e[i][j]=1; } } if(!bfs()){ printf("-1\n"); continue; } mem(A,0); for(i=0;i<n;i++){ for(j=0;j<m;j++){ if(vis[i][j]==-1)continue; int u=vis[i][j]; double p=1.0/cnt[i][j]; if(e[i][j]){ A[u][u]=1; A[u][tot]=0; continue; } A[u][u]=A[u][tot]=1; for(k=0;k<4;k++){ int x=i+dx[k],y=j+dy[k]; if(x>=0&&x<n && y>=0&&y<m && vis[x][y]!=-1){ A[u][vis[x][y]]=-p; } } } } gauss(tot); printf("%.6lf\n",A[vis[sx][sy]][tot]); } return 0; }
相关文章推荐
- HDU 2262 Where is the canteen 概率DP 高斯消元
- HDU 2262 Where is the canteen 期望dp+高斯消元
- HDU 2262 Where is the canteen (高斯消元、概率)
- [ACM] hdu 2262 Where is the canteen (高斯消元求期望)
- HDU 2262 Where is the canteen 期望 + 高斯消元
- hdu2262 Where is the canteen(高斯消元求期望dp)
- HDU 2262 Where is the canteen(高斯求期望问题)
- HDOJ 2262 Where is the canteen (高斯消元 + bfs)
- hdu2262——Where is the canteen
- Hdu 5955 Guessing the Dice Roll 概率DP+高斯消元
- hdu 4418 高斯消元+概率dp
- hdu4418——Time travel(概率DP+高斯消元)
- HDU 4326 Game 概率DP 高斯消元
- 【HDU 4418】【概率DP 高斯消元】 Time travel 给出一个数轴,有一个起点和终点,某人可以走1-m步,每一种有一个概率,初始有一个方向,走到头则返回,问到达终点期望
- hdu 4870 Rating (高斯消元解概率dp)
- HDU 4418 Time travel(高斯消元+概率DP)
- HDU 4118 Time travel (高斯消元+概率dp)
- HDU 4870 Rating 2014 Multi-University Training Contest 1 J题 概率DP+高斯消元
- HDU 4418 Time travel (概率DP+高斯消元)
- 概率dp+高斯消元解方程组-hdu-4326-Game