Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 125536/65536 K (Java/Others)
Total Submission(s): 3738 Accepted Submission(s): 1488
dp[i][j]=p2[i][j]*dp[i][j+1]/(1-p1[i][j])+p3[i][j]*dp[i+1][j]/(1-p1[i][j])+2/(1-p1[i][j]);
///1085422276 #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<queue> #include<cmath> #include<map> #include<bitset> #include<set> #include<vector> using namespace std ; typedef long long ll; #define push_back pb #define mem(a) memset(a,0,sizeof(a)) #define TS printf("111111\n"); #define FOR(i,a,b) for( int i=a;i<=b;i++) #define FORJ(i,a,b) for(int i=a;i>=b;i--) #define READ(a,b) scanf("%d%d",&a,&b) #define mod 1000000007 #define inf 100000 #define maxn 1001 inline ll read() { ll x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} return x*f; } //****************************************************************** int n,m; double p1[maxn][maxn],p2[maxn][maxn],p3[maxn][maxn]; double dp[maxn][maxn]; int main() { while(READ(n,m)!=EOF) { FOR(i,0,n-1) FOR(j,0,m-1) scanf("%lf%lf%lf",&p1[i][j],&p2[i][j],&p3[i][j]); mem(dp); FORJ(i,n-1,0) FORJ(j,m-1,0) { if(i==n-1&&j==m-1){continue;} if(p1[i][j]==1)dp[i][j]=0; else dp[i][j]=p2[i][j]*dp[i][j+1]/(1-p1[i][j])+p3[i][j]*dp[i+1][j]/(1-p1[i][j])+2/(1-p1[i][j]); } printf("%.3f\n",dp[0][0]); } return 0; }
原文:http://www.cnblogs.com/zxhl/p/4781635.html