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; }