CodeForces - 24D :Broken robot (高斯消元 隨機)
阿新 • • 發佈:2019-05-12
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 (高斯消元 隨機)