1. 程式人生 > >CodeForces - 24D :Broken robot (高斯消元 隨機)

CodeForces - 24D :Broken robot (高斯消元 隨機)

scan 一行 方程 scanf ret color ORC include def

pro:給定N*M的矩陣,以及初始玩家位置。 規定玩家每次會等概率的向左走,向右走,向下走,問走到最後一行的期望。保留4位小數。

sol:可以列出方程,高斯消元即可,發現是三角矩陣,O(N^2)。 也可以用反復逼近答案。 反復做,dp[i][j]=(dp[i][j+1]+dp[i][j-1]+dp[i][j]+dp[i-1][j])/d[j]+1.0 為了使逼近效果更好,我每次先左一次,再右一次。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn=1010; double dp[maxn][maxn]; int d[maxn]; int main() { int N,M,x,y; scanf("%d%d%d%d",&N,&M,&x,&y); rep(i,1,M){ d[i]=2; if(i>1) d[i]++; if(i<M) d[i]++; } rep(i,x+1,N){ rep(t,1,20){ rep(j,1,M) dp[i][j]=(dp[i][j+1
]+dp[i][j-1]+dp[i][j]+dp[i-1][j])/d[j]+1.0; for(int j=M;j>=1;j--) dp[i][j]=(dp[i][j+1]+dp[i][j-1]+dp[i][j]+dp[i-1][j])/d[j]+1.0; } } printf("%.10lf\n",dp[N][y]); return 0; }

CodeForces - 24D :Broken robot (高斯消元 隨機)