直接$dp$会有后效性,用高斯消元解决。
因为在这道题中列出的增广矩阵很有特点,所以用$O(M)$的时间复杂度就可以解出来。
注意$m=1$时的情况。
#include<iostream> #include<cstdio> using namespace std; double f[1005][1005],g[1005][1005]; int main() { int n=0,m=0,x=0,y=0; scanf("%d%d%d%d",&n,&m,&x,&y); n-=x-1,x=1; for(int i=1;i<=m;i++) f[n][i]=0; for(int i=n-1;i>=1;i--) { if(m==1) { f[i][m]=2*((double)1/2*f[i+1][m]+1); continue; } for(int j=1;j<=m;j++) if(j==1) { g[j][j]=(double)2/3; g[j][j+1]=(double)-1/3; g[j][m+1]=(double)1/3*f[i+1][j]+1; } else if(j==m) { g[j][j]=(double)2/3; g[j][j-1]=(double)-1/3; g[j][m+1]=(double)1/3*f[i+1][j]+1; } else { g[j][j]=(double)3/4; g[j][j-1]=(double)-1/4; g[j][j+1]=(double)-1/4; g[j][m+1]=(double)1/4*f[i+1][j]+1; } for(int j=1;j<=m-1;j++) { double x=-g[j+1][j]/g[j][j]; g[j][j]*=x; if(j!=1) g[j][j-1]*=x; g[j][j+1]*=x,g[j][m+1]*=x; g[j+1][j]+=g[j][j]; g[j+1][j+1]+=g[j][j+1]; g[j+1][m+1]+=g[j][m+1]; } f[i][m]=g[m][m+1]/g[m][m]; for(int j=m-1;j>=1;j--) f[i][j]=(g[j][m+1]-g[j][j+1]*f[i][j+1])/g[j][j]; } printf("%.4f",f[x][y]); return 0; }
CF24D
原文地址:https://www.cnblogs.com/wozaixuexi/p/11241533.html
时间: 2024-10-06 09:48:35