CodeForces - 24D :Broken robot (高斯消元 随机)

pro:给定N*M的矩阵,以及初始玩家位置。 规定玩家每次会等概率的向左走,向右走,向下走,原地不动,问走到最后一行的期望。保留4位小数。

sol:可以列出方程,高斯消元即可,发现是三角矩阵,O(N*M)----元素个数。  也可以用反复逼近答案。 反复做,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;
}

猜你喜欢

转载自www.cnblogs.com/hua-dong/p/10851746.html